From 8d03032a83fefb817e244d4ce3ca695732090deb Mon Sep 17 00:00:00 2001 From: antirez Date: Tue, 21 Apr 2009 19:43:02 +0200 Subject: [PATCH] PHP client ported to PHP5 and fixed --- client-libraries/php/redis.php | 305 ++++++++++++++++++--------------- client-libraries/php/tests.php | 13 +- 2 files changed, 176 insertions(+), 142 deletions(-) diff --git a/client-libraries/php/redis.php b/client-libraries/php/redis.php index 643a3ecbc..a939cbae5 100644 --- a/client-libraries/php/redis.php +++ b/client-libraries/php/redis.php @@ -3,6 +3,7 @@ * Redis PHP Bindings - http://code.google.com/p/redis/ * * Copyright 2009 Ludovico Magnocavallo + * Copyright 2009 Salvatore Sanfilippo (ported it to PHP5, fixed some bug) * Released under the same license as Redis. * * Version: 0.1 @@ -14,240 +15,268 @@ class Redis { - - var $server; - var $port; - var $_sock; - - function Redis($host='localhost', $port=6379) { + public $server; + public $port; + private $_sock; + + public function __construct($host='localhost', $port=6379) { $this->host = $host; $this->port = $port; } - function connect() { - if ($this->_sock) - return; + public function connect() { + if ($this->_sock) return; if ($sock = fsockopen($this->host, $this->port, $errno, $errstr)) { $this->_sock = $sock; return; } $msg = "Cannot open socket to {$this->host}:{$this->port}"; if ($errno || $errmsg) - $msg .= "," . ($errno ? " error $errno" : "") . ($errmsg ? " $errmsg" : ""); + $msg .= "," . ($errno ? " error $errno" : "") . + ($errmsg ? " $errmsg" : ""); trigger_error("$msg.", E_USER_ERROR); } - function disconnect() { - if ($this->_sock) - @fclose($this->_sock); + public function disconnect() { + if ($this->_sock) @fclose($this->_sock); $this->_sock = null; } - function &ping() { + public function ping() { $this->connect(); - $this->_write("PING\r\n"); + $this->write("PING\r\n"); return $this->get_response(); } - function &do_echo($s) { + public function do_echo($s) { $this->connect(); - $this->_write("ECHO " . strlen($s) . "\r\n$s\r\n"); - return $this->_get_value(); + $this->write("ECHO " . strlen($s) . "\r\n$s\r\n"); + return $this->get_response(); } - function &set($name, $value, $preserve=false) { + public function set($name, $value, $preserve=false) { $this->connect(); - $this->_write( + $this->write( ($preserve ? 'SETNX' : 'SET') . " $name " . strlen($value) . "\r\n$value\r\n" ); return $this->get_response(); } - function &get($name) { + public function get($name) { $this->connect(); - $this->_write("GET $name\r\n"); - return $this->_get_value(); + $this->write("GET $name\r\n"); + return $this->get_response(); } - function &incr($name, $amount=1) { + public function incr($name, $amount=1) { $this->connect(); if ($amount == 1) - $this->_write("INCR $name\r\n"); + $this->write("INCR $name\r\n"); else - $this->_write("INCRBY $name $amount\r\n"); + $this->write("INCRBY $name $amount\r\n"); return $this->get_response(); } - function &decr($name, $amount=1) { + public function decr($name, $amount=1) { $this->connect(); if ($amount == 1) - $this->_write("DECR $name\r\n"); + $this->write("DECR $name\r\n"); else - $this->_write("DECRBY $name $amount\r\n"); + $this->write("DECRBY $name $amount\r\n"); return $this->get_response(); } - function &exists($name) { + public function exists($name) { $this->connect(); - $this->_write("EXISTS $name\r\n"); + $this->write("EXISTS $name\r\n"); return $this->get_response(); } - function &delete($name) { + public function delete($name) { $this->connect(); - $this->_write("DEL $name\r\n"); + $this->write("DEL $name\r\n"); return $this->get_response(); } - function &keys($pattern) { + public function keys($pattern) { $this->connect(); - $this->_write("KEYS $pattern\r\n"); - return explode(' ', $this->_get_value()); + $this->write("KEYS $pattern\r\n"); + return explode(' ', $this->get_response()); } - function &randomkey() { + public function randomkey() { $this->connect(); - $this->_write("RANDOMKEY\r\n"); + $this->write("RANDOMKEY\r\n"); return $this->get_response(); } - function &rename($src, $dst, $preserve=False) { + public function rename($src, $dst) { $this->connect(); - $this->_write($preserve ? "RENAMENX $src $dst\r\n" : "RENAME $src $dst\r\n"); + $this->write("RENAME $src $dst\r\n"); + return $this->get_response(); + } + + public function renamenx($src, $dst) { + $this->connect(); + $this->write("RENAMENX $src $dst\r\n"); return $this->get_response(); } - function &expire($name, $time) { + public function expire($name, $time) { $this->connect(); - $this->_write("EXPIRE $name $time\r\n"); + $this->write("EXPIRE $name $time\r\n"); return $this->get_response(); } - function &push($name, $value, $tail=true) { + public function push($name, $value, $tail=true) { // default is to append the element to the list $this->connect(); - $this->_write( + $this->write( ($tail ? 'RPUSH' : 'LPUSH') . " $name " . strlen($value) . "\r\n$value\r\n" ); return $this->get_response(); } - - function <rim($name, $start, $end) { + + public function lpush($name, $value) { + return $this->push($name, $value, false); + } + + public function rpush($name, $value) { + return $this->push($name, $value, true); + } + + public function ltrim($name, $start, $end) { $this->connect(); - $this->_write("LTRIM $name $start $end\r\n"); + $this->write("LTRIM $name $start $end\r\n"); return $this->get_response(); } - function &lindex($name, $index) { + public function lindex($name, $index) { $this->connect(); - $this->_write("LINDEX $name $index\r\n"); - return $this->_get_value(); + $this->write("LINDEX $name $index\r\n"); + return $this->get_response(); } - function &pop($name, $tail=true) { + public function pop($name, $tail=true) { $this->connect(); - $this->_write( + $this->write( ($tail ? 'RPOP' : 'LPOP') . " $name\r\n" ); - return $this->_get_value(); - } - - function &llen($name) { - $this->connect(); - $this->_write("LLEN $name\r\n"); - return $this->get_response(); - } - - function &lrange($name, $start, $end) { - $this->connect(); - $this->_write("LRANGE $name $start $end\r\n"); return $this->get_response(); } - function &sort($name, $query=false) { + public function lpop($name, $value) { + return $this->pop($name, $value, false); + } + + public function rpop($name, $value) { + return $this->pop($name, $value, true); + } + + public function llen($name) { $this->connect(); - $this->_write($query == false ? "SORT $name\r\n" : "SORT $name $query\r\n"); + $this->write("LLEN $name\r\n"); return $this->get_response(); } - function &lset($name, $value, $index) { + public function lrange($name, $start, $end) { $this->connect(); - $this->_write("LSET $name $index " . strlen($value) . "\r\n$value\r\n"); - return $this->get_response(); - } - - function &sadd($name, $value) { - $this->connect(); - $this->_write("SADD $name " . strlen($value) . "\r\n$value\r\n"); - return $this->get_response(); - } - - function &srem($name, $value) { - $this->connect(); - $this->_write("SREM $name " . strlen($value) . "\r\n$value\r\n"); - return $this->get_response(); - } - - function &sismember($name, $value) { - $this->connect(); - $this->_write("SISMEMBER $name " . strlen($value) . "\r\n$value\r\n"); - return $this->get_response(); - } - - function &sinter($sets) { - $this->connect(); - $this->_write('SINTER ' . implode(' ', $sets) . "\r\n"); - return $this->get_response(); - } - - function &smembers($name) { - $this->connect(); - $this->_write("SMEMBERS $name\r\n"); + $this->write("LRANGE $name $start $end\r\n"); return $this->get_response(); } - function &scard($name) { + public function sort($name, $query=false) { $this->connect(); - $this->_write("SCARD $name\r\n"); + $this->write($query == false ? "SORT $name\r\n" : "SORT $name $query\r\n"); return $this->get_response(); } - function &select_db($name) { + public function lset($name, $value, $index) { $this->connect(); - $this->_write("SELECT $name\r\n"); + $this->write("LSET $name $index " . strlen($value) . "\r\n$value\r\n"); return $this->get_response(); } - function &move($name, $db) { + public function sadd($name, $value) { $this->connect(); - $this->_write("MOVE $name $db\r\n"); + $this->write("SADD $name " . strlen($value) . "\r\n$value\r\n"); return $this->get_response(); } - function &save($background=false) { + public function srem($name, $value) { $this->connect(); - $this->_write(($background ? "BGSAVE\r\n" : "SAVE\r\n")); + $this->write("SREM $name " . strlen($value) . "\r\n$value\r\n"); return $this->get_response(); } - function &lastsave() { + public function sismember($name, $value) { $this->connect(); - $this->_write("LASTSAVE\r\n"); + $this->write("SISMEMBER $name " . strlen($value) . "\r\n$value\r\n"); return $this->get_response(); } - function &flush($all=false) { + public function sinter($sets) { $this->connect(); - $this->_write($all ? "FLUSH\r\n" : "FLUSHDB\r\n"); + $this->write('SINTER ' . implode(' ', $sets) . "\r\n"); return $this->get_response(); } - function &info() { + public function smembers($name) { $this->connect(); - $this->_write("INFO\r\n"); + $this->write("SMEMBERS $name\r\n"); + return $this->get_response(); + } + + public function scard($name) { + $this->connect(); + $this->write("SCARD $name\r\n"); + return $this->get_response(); + } + + public function select_db($name) { + $this->connect(); + $this->write("SELECT $name\r\n"); + return $this->get_response(); + } + + public function move($name, $db) { + $this->connect(); + $this->write("MOVE $name $db\r\n"); + return $this->get_response(); + } + + public function save($background=false) { + $this->connect(); + $this->write(($background ? "BGSAVE\r\n" : "SAVE\r\n")); + return $this->get_response(); + } + + public function bgsave($background=false) { + return $this->save(true); + } + + public function lastsave() { + $this->connect(); + $this->write("LASTSAVE\r\n"); + return $this->get_response(); + } + + public function flushdb($all=false) { + $this->connect(); + $this->write($all ? "FLUSHALL\r\n" : "FLUSHDB\r\n"); + return $this->get_response(); + } + + public function flushall() { + return $this->flush(true); + } + + public function info() { + $this->connect(); + $this->write("INFO\r\n"); $info = array(); $data =& $this->get_response(); foreach (explode("\r\n", $data) as $l) { @@ -260,7 +289,7 @@ class Redis { return $info; } - function &_write($s) { + private function write($s) { while ($s) { $i = fwrite($this->_sock, $s); if ($i == 0) // || $i == strlen($s)) @@ -269,64 +298,68 @@ class Redis { } } - function &_read($len=1024) { + private function read($len=1024) { if ($s = fgets($this->_sock)) return $s; $this->disconnect(); trigger_error("Cannot read from socket.", E_USER_ERROR); } - function &get_response() { - $data = trim($this->_read()); + private function get_response() { + $data = trim($this->read()); $c = $data[0]; $data = substr($data, 1); switch ($c) { case '-': - trigger_error(substr($data, 0, 4) == 'ERR ' ? substr($data, 4) : $data, E_USER_ERROR); + trigger_error($data, E_USER_ERROR); break; case '+': return $data; + case ':': + $i = strpos($data, '.') !== false ? (int)$data : (float)$data; + if ((string)$i != $data) + trigger_error("Cannot convert data '$c$data' to integer", E_USER_ERROR); + return $i; + case '$': + return $this->get_bulk_reply($c . $data); case '*': $num = (int)$data; if ((string)$num != $data) trigger_error("Cannot convert multi-response header '$data' to integer", E_USER_ERROR); $result = array(); for ($i=0; $i<$num; $i++) - $result[] =& $this->_get_value(); + $result[] =& $this->get_response(); return $result; default: - return $this->_get_value($c . $data); + trigger_error("Invalid reply type byte: '$c'"); } } - function &_get_value($data=null) { + private function get_bulk_reply($data=null) { if ($data === null) - $data =& trim($this->_read()); + $data = trim($this->read()); if ($data == '$-1') return null; $c = $data[0]; $data = substr($data, 1); - $i = strpos($data, '.') !== false ? (int)$data : (float)$data; - if ((string)$i != $data) - trigger_error("Cannot convert data '$c$data' to integer", E_USER_ERROR); - if ($c == ':') - return $i; + $bulklen = (int)$data; + if ((string)$bulklen != $data) + trigger_error("Cannot convert bulk read header '$c$data' to integer", E_USER_ERROR); if ($c != '$') trigger_error("Unkown response prefix for '$c$data'", E_USER_ERROR); $buffer = ''; - while (true) { - $data =& $this->_read(); - $i -= strlen($data); + while ($bulklen) { + $data = fread($this->_sock,$bulklen); + $bulklen -= strlen($data); $buffer .= $data; - if ($i < 0) - break; } - return substr($buffer, 0, -2); + $crlf = fread($this->_sock,2); + return $buffer; } - -} +} -//$r =& new Redis(); -//var_dump($r->info()); +$r = new Redis(); +var_dump($r->get("foo")); +var_dump($r->info()); ?> diff --git a/client-libraries/php/tests.php b/client-libraries/php/tests.php index 72856b8c9..d7bf74cfb 100644 --- a/client-libraries/php/tests.php +++ b/client-libraries/php/tests.php @@ -7,7 +7,8 @@ require_once('redis.php'); $r =& new Redis('localhost'); $r->connect(); $r->select_db(9); -$r->flush(); +$r->flushdb(); +echo "
\n";
 echo $r->ping() . "\n";
 echo $r->do_echo('ECHO test') . "\n";
 echo "SET aaa " . $r->set('aaa', 'bbb') . "\n";
@@ -29,15 +30,15 @@ echo 'SET a1 a2 a3' . $r->set('a1', 'a') . $r->set('a2', 'b') . $r->set('a3', 'c
 echo 'KEYS a* ' . print_r($r->keys('a*'), true) . "\n";
 echo 'RANDOMKEY ' . $r->randomkey('a*') . "\n";
 echo 'RENAME a1 a0 ' . $r->rename('a1', 'a0') . "\n";
-echo 'RENAMENX a0 a2 ' . $r->rename('a0', 'a2', true) . "\n";
-echo 'RENAMENX a0 a1 ' . $r->rename('a0', 'a1', true) . "\n";
+echo 'RENAMENX a0 a2 ' . $r->renamenx('a0', 'a2') . "\n";
+echo 'RENAMENX a0 a1 ' . $r->renamenx('a0', 'a1') . "\n";
 
 echo 'LPUSH a0 aaa ' . $r->push('a0', 'aaa') . "\n";
 echo 'LPUSH a0 bbb ' . $r->push('a0', 'bbb') . "\n";
 echo 'RPUSH a0 ccc ' . $r->push('a0', 'ccc', false) . "\n";
 echo 'LLEN a0 ' . $r->llen('a0') . "\n";
 echo 'LRANGE sdkjhfskdjfh 0 100 ' . print_r($r->lrange('sdkjhfskdjfh', 0, 100), true) . "\n";
-echo 'LRANGE a0 0 0 ' . print_r($r->lrange('sdkjhfskdjfh', 0, 0), true) . "\n";
+echo 'LRANGE a0 0 0 ' . print_r($r->lrange('a0', 0, 0), true) . "\n";
 echo 'LRANGE a0 0 100 ' . print_r($r->lrange('a0', 0, 100), true) . "\n";
 echo 'LTRIM a0 0 1 ' . $r->ltrim('a0', 0, 1) . "\n";
 echo 'LRANGE a0 0 100 ' . print_r($r->lrange('a0', 0, 100), true) . "\n";
@@ -82,5 +83,5 @@ echo 'BGSAVE ' . $r->save(true) . "\n";
 echo 'LASTSAVE ' . $r->lastsave() . "\n";
 
 echo 'INFO ' . print_r($r->info()) . "\n";
-
-?>
\ No newline at end of file
+echo "
\n"; +?>