由于个人电脑的原因,memcache.dll无法使用。这样我就无法操作memcached服务了。
思来想去,就自己写一个API吧。顺便也了解一下memcached协议。
贴代码
<?php /** * * memcached连接客户端 * */ class my_memcache{ protected $socket = false; protected $server_list = array(); protected $host = false; protected $port = false; protected $threshold = 0; protected $min_saving = 0; function __construct() { $this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); } function __destruct() { socket_close($this->socket); } /** * 完成 */ public function add($key,$var,$flag=0,$expire=0){ $this->selectconnect($key); if ( is_array($var) ){ $var = serialize($var); } $len = strlen($var); if ( $len > $this->threshold && $this->threshold > 0 ){ $flag=1; $var = $this->gz_ungz_compress($var,1); $len = strlen($var); } $in = "add $key $flag $expire $len\r\n"; $in .= $var."\r\n"; socket_write($this->socket, $in, strlen($in)); $out = socket_read($this->socket,1024); $out = trim(str_replace("\r\n","",$out)); if ( strtoupper($out) == "STORED" ){ return true; }else{ return false; } } /** * 完成 */ public function addServer($host,$port,$persistent=true,$weight=1,$timeout=1,$retry_interval=15,$status=1,$failure_callback = NULL ,$timeoutms = 0){ if ( empty($host) || empty($port) ){ return false; } $this->server_list[] = array('host' => $host , 'port' => $port , 'persistent' => true, 'weight' => $weight , 'timeout' => $timeout , 'retry_interval' => $retry_interval , 'status' => $status , 'failure_callback' => $failure_callback ); } /** * 完成 */ public function close(){ return socket_close($this->socket); } /** * 完成 */ public function connect($host,$port=11211,$timeout=1){ $this->host = $host; $this->port = $port; return socket_connect($this->socket,$host,$port); } /** * 完成 */ protected function selectconnect($key){ if ( empty($key) || empty($this->server_list) ){ return false; } $len = count($this->server_list)-1; $first = ord(substr($key,0,1)); $key = $first%$len; $server = $this->server_list[$key]; if ( $server['persistent'] ){ socket_get_option ($this->socket,1,SO_KEEPALIVE); } return socket_connect($this->socket,$server['host'],$server['port']); } /** * 完成 */ public function decrement($key,$value=1){ if ( empty($key) ){ return false; } $val = intval($value); $this->selectconnect($key); $in = "decr $key $val\r\n"; socket_write($this->socket, $in, strlen($in)); $out = socket_read($this->socket,1024); $out = trim(str_replace("\r\n","",$out)); return $out; } /** * 完成 */ public function delete($key,$timeout =0){ $this->selectconnect($key); $in = "delete $key\r\n"; socket_write($this->socket, $in, strlen($in)); $out = socket_read($this->socket,1024); $out = trim(str_replace("\r\n","",$out)); if ( $out == 'DELETED' ){ return true; }else if ( $out == 'NOT_FOUND' ){ return false; }else{ return false; } } /** * 完成 */ public function get($key,$flag=0){ if ( empty($key) ){ return false; } $this->selectconnect($key); $in = "get $key $flag\r\n"; socket_write($this->socket, $in, strlen($in)); $out = socket_read($this->socket,90240); $out_array = explode("\r\n",$out); $l1 = $out_array[0]; $l1_array = explode(" ",$l1); $content = str_replace(array("\r","\n"),'',$out_array[1]); if ( $l1_array[2] == 1 ){ $content = $this->gz_ungz_compress($content,2); } if ( empty($content) ){ return false; }else{ return $content; } } /** * 完成 */ public function getServerStatus($host,$port=11211){ if ( empty($host) ){ return false; } $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ( socket_connect($socket,$host,$port) ){ socket_close($socket); return 1; }else{ return 0; } } /** * 完成 */ public function increment($key,$value=1){ if ( empty($key) ){ return false; } $val = intval($value); $this->selectconnect($key); $in = "incr $key $val\r\n"; socket_write($this->socket, $in, strlen($in)); $out = socket_read($this->socket,1024); $out = trim(str_replace("\r\n","",$out)); return $out; } /** * 完成 */ public function pconnect($host,$port=11211,$timeout=1){ if ( !socket_set_option($this->socket, SOL_SOCKET, SO_KEEPALIVE, 1) ) { return false; } return socket_connect($this->socket,$host,$port); } /** * 完成 */ public function replace($key,$var,$flag=0,$expire=0){ $len = strlen($var); if ( $len > $this->threshold && $this->threshold > 0 ){ $flag=1; $var = $this->gz_ungz_compress($var,1); $len = strlen($var); } $in = "replace $key $flag $expire $len\r\n"; $in .= $var."\r\n"; socket_write($this->socket, $in, strlen($in)); $out = socket_read($this->socket,1024); $out = trim(str_replace("\r\n","",$out)); if ( strtoupper($out) == "STORED" ){ return true; }else{ return false; } } /** * 完成 */ public function set($key,$var,$flag=0,$expire=0){ $this->selectconnect($key); if ( is_array($var) ){ $var = serialize($var); } $len = strlen($var); if ( $len > $this->threshold && $this->threshold > 0 ){ $flag=1; $var = $this->gz_ungz_compress($var,1); $len = strlen($var); } $in = "set $key $flag $expire $len\r\n"; $in .= $var."\r\n"; socket_write($this->socket, $in, strlen($in)); $out = socket_read($this->socket,1024); $out = trim(str_replace("\r\n","",$out)); if ( strtoupper($out) == "STORED" ){ return true; }else{ return false; } } /** * 完成 */ public function getVersion(){ $result = array(); if ( $this->server_list ){ foreach ( $this->server_list as $s ) { $key = $s['host'].":".$s['port']; $in = "version\r\n"; $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_connect($socket,$s['host'],$s['port']); socket_write($socket, $in, strlen($in)); $out = socket_read($socket,1024); $out = str_replace(array("\r","\n"),"",$out); $out = str_replace("VERSION ","",$out); $result[$key]= $out; } return $result; }else{ $in = "version\r\n"; socket_write($this->socket, $in, strlen($in)); $out = socket_read($this->socket,1024); $out = str_replace(array("\r","\n"),"",$out); $out = str_replace("VERSION ","",$out); $key = $this->host.":".$this->port; $result[$key]= $out; return $result; } } /** * 完成 */ public function flush(){ $result = array(); if ( $this->server_list ){ foreach ( $this->server_list as $s ) { $key = $s['host'].":".$s['port']; $in = "flush_all\r\n"; $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_connect($socket,$s['host'],$s['port']); socket_write($socket, $in, strlen($in)); $out = socket_read($socket,1024); $out = str_replace(array("\r","\n"),"",$out); if ( $out == "OK" ){ $result[$key]= true; }else{ $result[$key]= false; } } return $result; }else{ $in = "flush_all\r\n"; socket_write($this->socket, $in, strlen($in)); $out = socket_read($this->socket,1024); $out = str_replace(array("\r","\n"),"",$out); $key = $this->host.":".$this->port; if ( $out == "OK" ){ $result[$key]= true; }else{ $result[$key]= false; } return $result; } } /** * 完成 */ public function getStats($type=0,$slabid=0,$limit=0){ $this->getExtendedStats($type,$slabid,$limit); } /** * stats reset 清空统计数据=>返回reset * stats slabs 显示各个slab的信息,包括chunk的大小、数目、使用情况等 * stats cachedump slab_id limit_num 显示某个slab中的前limit_num个key列表 * stats items * stats detail [on|off|dump] 设置或者显示详细操作记录 * stats malloc 显示内存分配数据 */ public function getExtendedStats($type=0,$slabid=0,$limit=0){ $type_list = array('reset','malloc','maps','cachedump','slabs','items','sizes'); if ( $type ){ if ( !in_array($type,$type_list) ){ $type = ''; } } $slabid = intval($slabid); $limit = intval($limit); $result = array(); if ( $this->server_list ){ foreach ( $this->server_list as $s ) { $key = $s['host'].":".$s['port']; $in = "stats\r\n"; $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_connect($socket,$s['host'],$s['port']); socket_write($socket, $in, strlen($in)); $out = socket_read($socket,10240); $out = explode("\r\n",$out); foreach ($out as $s) { if ( $s ){ $temp = explode(" ",$s); if ( count($temp) > 2 ){ $result[$key][$temp[1]] = $temp[2]; } } } } return $result; }else{ $in = "stats\r\n"; socket_write($this->socket, $in, strlen($in)); $out = socket_read($this->socket,10240); if ( empty($out) ){ return false; }else{ $key = $this->host.":".$this->port; $out = explode("\r\n",$out); foreach ($out as $s) { if ( $s ){ $temp = explode(" ",$s); if ( count($temp) > 2 ){ $result[$key][$temp[1]] = $temp[2]; } } } return $result; } } } //开启大值自动压缩(完成) public function setCompressThreshold($threshold,$min_saving){ $threshold = intval($threshold); $min_saving = floatval($min_saving); if ( $threshold <= 0 || $min_saving <= 0 || $min_saving >= 1 ){ return false; } $this->threshold = $threshold; $this->min_saving = $min_saving*10; return true; } //压解--压缩(完成) 默认压缩,否则解压 protected function gz_ungz_compress($string,$type=1){ if ( $type == 1 ){ return gzcompress($string,$this->min_saving); }else{ return gzuncompress($string); } } //运行时修改服务器参数和状态(完成) public function setServerParams($host,$port,$timeout=1,$retry_interval=15,$status=1,$failure_callback = NULL){ if ( empty($host) || empty($port) ){ return false; } foreach ($this->server_list as $key => $row ) { if ( $row['host'] == $host && $row['port'] == $port ){ $row['timeout'] = $timeout; $row['retry_interval'] = $retry_interval; $row['status'] = $status; $row['failure_callback'] = $failure_callback; $this->server_list[$key] = $row; return true; } } return false; } }
跟使用php的memcache扩展是一样的。这次更深入了解他的内部机制了.
extra clothes for the 3 year old and all the baby gear
porno Where Does Your Power Come From
sometimes pumps if I need to be super dressy
snooki weight lossMETTLER TOLEDO Offers Free System Handbook To Integrate Weigh Modules
snooki weight lossMETTLER TOLEDO Offers Free System Handbook To Integrate Weigh Modules