Browse Source

Do some micro-optimizations to reduce the overhead of creating client instances.

Daniele Alessandri 14 years ago
parent
commit
de1a183315

+ 14 - 11
lib/Predis/Client.php

@@ -37,22 +37,25 @@ class Client {
         throw new \InvalidArgumentException("Invalid type for client options");
     }
 
-    private function initializeConnection($parameters = array()) {
+    private function initializeConnection($parameters = null) {
         if ($parameters === null) {
-            return $this->createConnection(array());
+            return $this->createConnection(new ConnectionParameters());
+        }
+        if (is_array($parameters)) {
+            if (isset($parameters[0])) {
+                $cluster = new ConnectionCluster($this->_options->key_distribution);
+                foreach ($parameters as $single) {
+                    $cluster->add($single instanceof IConnectionSingle
+                        ? $single : $this->createConnection($single)
+                    );
+                }
+                return $cluster;
+            }
+            return $this->createConnection($parameters);
         }
         if ($parameters instanceof IConnection) {
             return $parameters;
         }
-        if (is_array($parameters) && isset($parameters[0])) {
-            $cluster = new ConnectionCluster($this->_options->key_distribution);
-            foreach ($parameters as $single) {
-                $cluster->add($single instanceof IConnectionSingle
-                    ? $single : $this->createConnection($single)
-                );
-            }
-            return $cluster;
-        }
         return $this->createConnection($parameters);
     }
 

+ 5 - 8
lib/Predis/ClientOptions.php

@@ -59,19 +59,16 @@ class ClientOptions {
         }
     }
 
-    private function tryInitializeValue($option) {
+    public function __get($option) {
+        if (isset($this->_options[$option])) {
+            return $this->_options[$option];
+        }
         if (isset($this->_handlers[$option])) {
             $opts = self::getSharedOptions();
             $value = $opts[$option]->getDefault();
             $this->_options[$option] = $value;
             return $value;
         }
-    }
-
-    public function __get($option) {
-        if (isset($this->_options[$option])) {
-            return $this->_options[$option];
-        }
-        return $this->tryInitializeValue($option);
+        return null;
     }
 }

+ 7 - 10
lib/Predis/ConnectionParameters.php

@@ -92,11 +92,11 @@ class ConnectionParameters {
         if ($parsed === false || !isset($parsed['host'])) {
             throw new \InvalidArgumentException("Invalid URI: $uri");
         }
-        if (array_key_exists('query', $parsed)) {
+        if (isset($parsed['query'])) {
             $query  = explode('&', $parsed['query']);
             $parsed = array_reduce($query, 'self::paramsExtractor', $parsed);
+            unset($parsed['query']);
         }
-        unset($parsed['query']);
         return $this->filter($parsed);
     }
 
@@ -110,19 +110,16 @@ class ConnectionParameters {
         return $parameters;
     }
 
-    private function tryInitializeValue($parameter) {
+    public function __get($parameter) {
+        if (isset($this->_parameters[$parameter])) {
+            return $this->_parameters[$parameter];
+        }
         if (isset(self::$_sharedOptions[$parameter])) {
             $value = self::$_sharedOptions[$parameter]->getDefault();
             $this->_parameters[$parameter] = $value;
             return $value;
         }
-    }
-
-    public function __get($parameter) {
-        if (isset($this->_parameters[$parameter])) {
-            return $this->_parameters[$parameter];
-        }
-        return $this->tryInitializeValue($parameter);
+        return null;
     }
 
     public function __isset($parameter) {

+ 7 - 5
lib/Predis/ConnectionSchemes.php

@@ -4,14 +4,16 @@ namespace Predis;
 
 class ConnectionSchemes implements IConnectionSchemes {
     private static $_globalSchemes;
-    private $_instanceSchemes;
+    private $_instanceSchemes = array();
 
-    public function __construct(Array $schemesMap = array()) {
+    public function __construct(Array $schemesMap = null) {
         self::ensureDefaultSchemes();
-        foreach ($schemesMap as $connectionClass) {
-            self::checkConnectionClass($connectionClass);
+        if (isset($schemesMap)) {
+            foreach ($schemesMap as $connectionClass) {
+                self::checkConnectionClass($connectionClass);
+            }
+            $this->_instanceSchemes = $schemesMap;
         }
-        $this->_instanceSchemes = $schemesMap;
     }
 
     private static function ensureDefaultSchemes() {

+ 5 - 4
lib/Predis/Network/ComposableStreamConnection.php

@@ -16,6 +16,11 @@ class ComposableStreamConnection extends StreamConnection implements IConnection
         parent::__construct($parameters);
     }
 
+    protected function initializeProtocol(ConnectionParameters $parameters) {
+        $this->_protocol->setOption('throw_errors', $parameters->throw_errors);
+        $this->_protocol->setOption('iterable_multibulk', $parameters->iterable_multibulk);
+    }
+
     public function setProtocol(IProtocolProcessor $protocol) {
         if ($protocol === null) {
             throw new \InvalidArgumentException("The protocol instance cannot be a null value");
@@ -27,10 +32,6 @@ class ComposableStreamConnection extends StreamConnection implements IConnection
         return $this->_protocol;
     }
 
-    protected function setProtocolOption($option, $value) {
-        return $this->_protocol->setOption($option, $value);
-    }
-
     public function writeBytes($value) {
         $socket = $this->getResource();
         while (($length = strlen($value)) > 0) {

+ 1 - 2
lib/Predis/Network/ConnectionBase.php

@@ -42,8 +42,7 @@ abstract class ConnectionBase implements IConnectionSingle {
     }
 
     protected function initializeProtocol(ConnectionParameters $parameters) {
-        $this->setProtocolOption('throw_errors', $parameters->throw_errors);
-        $this->setProtocolOption('iterable_multibulk', $parameters->iterable_multibulk);
+        // NOOP
     }
 
     protected abstract function createResource();

+ 5 - 13
lib/Predis/Network/StreamConnection.php

@@ -20,6 +20,11 @@ class StreamConnection extends ConnectionBase {
         }
     }
 
+    protected function initializeProtocol(ConnectionParameters $parameters) {
+        $this->_throwErrors = $parameters->throw_errors;
+        $this->_mbiterable = $parameters->iterable_multibulk;
+    }
+
     protected function createResource() {
         $parameters = $this->_params;
         $initializer = array($this, "{$parameters->scheme}StreamInitializer");
@@ -194,17 +199,4 @@ class StreamConnection extends ConnectionBase {
         $reply = $this->read();
         return isset($reply->skipParse) ? $reply : $command->parseResponse($reply);
     }
-
-    protected function setProtocolOption($option, $value) {
-        switch ($option) {
-            case 'iterable_multibulk':
-                $this->_mbiterable = (bool) $value;
-                break;
-            case 'throw_errors':
-                $this->_throwErrors = (bool) $value;
-                break;
-            default:
-                $this->onInvalidOption($option, $this->getParameters());
-        }
-    }
 }