diff --git a/lib/Predis.php b/lib/Predis.php index d7a60255..73233b93 100644 --- a/lib/Predis.php +++ b/lib/Predis.php @@ -85,6 +85,10 @@ class Client { return $this->_serverProfile; } + public function useMultiBulkIterator($value = true) { + Response::useMultiBulkIterator($value); + } + public function connect() { $this->_connection->connect(); } @@ -336,6 +340,15 @@ class ResponseMultiBulkHandler implements IResponseHandler { } } +class ResponseMultiBulkStreamHandler implements IResponseHandler { + public function handle($socket, $prefix, $rawLength) { + if (!is_numeric($rawLength)) { + throw new ClientException("Cannot parse '$rawLength' as data length"); + } + return new Utilities\MultiBulkResponseIterator($socket, (int)$rawLength); + } +} + class ResponseIntegerHandler implements IResponseHandler { public function handle($socket, $prefix, $number) { if (is_numeric($number)) { @@ -357,7 +370,7 @@ class Response { const QUEUED = 'QUEUED'; const NULL = 'nil'; - private static $_prefixHandlers; + private static $_prefixHandlers, $_useMultiBulkIterator; private static function initializePrefixHandlers() { return array( @@ -365,10 +378,22 @@ class Response { '-' => new ResponseErrorHandler(), ':' => new ResponseIntegerHandler(), '$' => new ResponseBulkHandler(), - '*' => new ResponseMultiBulkHandler() + '*' => self::$_useMultiBulkIterator + ? new ResponseMultiBulkStreamHandler() + : new ResponseMultiBulkHandler() ); } + public static function useMultiBulkIterator($value = null) { + if (is_bool($value)) { + self::$_useMultiBulkIterator = $value; + self::$_prefixHandlers = self::initializePrefixHandlers(); + } + else { + return self::$_useMultiBulkIterator; + } + } + public static function read($socket) { $header = fgets($socket); if ($header === false) {