Pārlūkot izejas kodu

Greatly improved the code that initially handles replies getting the correct reply handler. Also, performances might have improved a bit.

Daniele Alessandri 15 gadi atpakaļ
vecāks
revīzija
d51e8e0c25
1 mainītis faili ar 20 papildinājumiem un 17 dzēšanām
  1. 20 17
      lib/Predis.php

+ 20 - 17
lib/Predis.php

@@ -280,8 +280,7 @@ class Response {
     private static function initializePrefixHandlers() {
         return array(
             // status
-            '+' => function($socket) {
-                $status = rtrim(fgets($socket), Response::NEWLINE);
+            '+' => function($socket, $prefix, $status) {
                 if ($status === Response::OK) {
                     return true;
                 }
@@ -292,15 +291,12 @@ class Response {
             }, 
 
             // error
-            '-' => function($socket) {
-                $errorMessage = rtrim(fgets($socket), Response::NEWLINE);
+            '-' => function($socket, $prefix, $errorMessage) {
                 throw new ServerException(substr($errorMessage, 4));
             }, 
 
             // bulk
-            '$' => function($socket) {
-                $dataLength = rtrim(fgets($socket), Response::NEWLINE);
-
+            '$' => function($socket, $prefix, $dataLength) {
                 if (!is_numeric($dataLength)) {
                     throw new ClientException("Cannot parse '$dataLength' as data length");
                 }
@@ -319,8 +315,7 @@ class Response {
             }, 
 
             // multibulk
-            '*' => function($socket) {
-                $rawLength = rtrim(fgets($socket), Response::NEWLINE);
+            '*' => function($socket, $prefix, $rawLength) {
                 if (!is_numeric($rawLength)) {
                     throw new ClientException("Cannot parse '$rawLength' as data length");
                 }
@@ -334,8 +329,9 @@ class Response {
 
                 if ($listLength > 0) {
                     for ($i = 0; $i < $listLength; $i++) {
-                        $handler = Response::getPrefixHandler(fgetc($socket));
-                        $list[] = $handler($socket);
+                        Response::getHeader($socket, $mbPrefix, $mbPayload);
+                        $handler  = Response::getPrefixHandler($mbPrefix);
+                        $list[] = $handler($socket, $mbPrefix, $mbPayload);
                     }
                 }
 
@@ -343,8 +339,7 @@ class Response {
             }, 
 
             // integer
-            ':' => function($socket) {
-                $number = rtrim(fgets($socket), Response::NEWLINE);
+            ':' => function($socket, $prefix, $number) {
                 if (is_numeric($number)) {
                     return (int) $number;
                 }
@@ -367,6 +362,12 @@ class Response {
         }
         return self::$_prefixHandlers[$prefix];
     }
+
+    public static function getHeader($socket, &$prefix, &$payload) {
+        $header  = fgets($socket);
+        $prefix  = $header[0];
+        $payload = substr($header, 1, -2);
+    }
 }
 
 class ResponseQueued {
@@ -652,8 +653,9 @@ class Connection implements IConnection {
 
     public function readResponse(Command $command) {
         $socket   = $this->getSocket();
-        $handler  = Response::getPrefixHandler(fgetc($socket));
-        $response = $handler($socket);
+        Response::getHeader($socket, $prefix, $payload);
+        $handler  = Response::getPrefixHandler($prefix);
+        $response = $handler($socket, $prefix, $payload);
         return isset($response->queued) ? $response : $command->parseResponse($response);
     }
 
@@ -663,8 +665,9 @@ class Connection implements IConnection {
         if ($closesConnection) {
             return;
         }
-        $handler = Response::getPrefixHandler(fgetc($socket));
-        return $handler($socket);
+        Response::getHeader($socket, $prefix, $payload);
+        $handler  = Response::getPrefixHandler($prefix);
+        return $handler($socket, $prefix, $payload);
     }
 
     public function getSocket() {