亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

用PHP實現memcache客戶端

2019-11-08 20:14:10
字體:
來源:轉載
供稿:網友

1、緣起

偶然翻看openresty安裝文件的目錄,看到lualib/resty目錄下有一些用lua寫的模塊,其中有個memcached.lua,原來是memcache客戶端的源碼,突然想起memcached協議是基于命令行的。他這個模塊用到了ngx.socket.tcp模塊,粗略看了下,發現也不是特別復雜,就是用socket收發數據。于是心血來潮,百度了下memcached協議,來造個輪子。

2、代碼

memcached協議可參考:memcached協議中文版,講得挺詳細的。

廢話少說,上代碼(只實現了get,set,add,replace,flush_all共5個命令)。

/** 封裝的異常類 */class MemcacheException extends Exception { public function __construct($message, $code = 0) { parent::__construct($message, $code); }}class MyMemcacheClient { PRivate $host; private $port; private $socket; public function __construct() { $this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); } /** * 獲取最后一次的socket錯誤 * @return string 最后一次socket錯誤字符串 */ public function getSocketError() { return socket_strerror(socket_last_error($this->socket)); } /** * 拋出異常封裝函數 * @return MemcacheException MemcacheException實例 */ private function throwException() { throw new MemcacheException($this->getSocketError()); } /** * 鏈接memcached服務器 * @param string $host memcached監聽的ip * @param integer $port memcached監聽的端口 * @return boolean true表示連接成功,false表示連接失敗 */ public function connect($host = '127.0.0.1', $port = 11211) { $this->host = $host; $this->port = $port; $result = socket_connect($this->socket, $host, $port); if ($result === false) { return false; } else { return true; } } /** * 執行set|add|replace命令 * @param string $cmd 命令(set|add|replace) * @param string $key 鍵 * @param string $value 值 * @param nteger $ttl 生存時間 * @return boolean true for success, false for fail */ private function _set_add_replace($cmd, $key, $value, $ttl = 10) { $line1 = sprintf("$cmd %s 0 %d %d/r/n", $key, $ttl, strlen($value)); $line2 = $value . "/r/n"; $data = $line1 . $line2; $result = socket_write($this->socket, $data, strlen($data)); if ($result === false) { $this->throwException(); } $response = socket_read($this->socket, 1024, php_NORMAL_READ); /** 讀取最后一個 /n 字符 */ socket_read($this->socket, 1, PHP_BINARY_READ); if ($response === false) { $this->throwException(); } /** 操作成功會返回STORED/r/n */ if (!strncmp($response, 'STORED', 6)) { return true; } return false; } public function set($key, $value, $ttl = 10) { return $this->_set_add_replace('set', $key, $value, $ttl); } public function add($key, $value, $ttl = 10) { return $this->_set_add_replace('add', $key, $value, $ttl); } public function replace($key, $value, $ttl = 10) { return $this->_set_add_replace('replace', $key, $value, $ttl); } /** * 獲取一個鍵的值 * @param string $key 鍵 * @return string|boolean 值, false表示沒有這個鍵或者已過期 */ public function get($key) { $data = sprintf("get %s/r/n", $key); $result = socket_write($this->socket, $data, strlen($data)); if ($result === false) { $this->throwException(); } $line1 = socket_read($this->socket, 1024, PHP_NORMAL_READ); /** 讀取最后一個 /n 字符 */ socket_read($this->socket, 1, PHP_BINARY_READ); if (!$line1) { $this->throwException(); } /** 獲取成功,第一行返回 VALUE <key> <flags> <bytes>/r/n */ if (!strncmp($line1, "VALUE", 5)) { $line1 = rtrim($line1, "/r/n"); $arr = explode(' ', $line1); /** 獲取數據長度 */ $dataLen = intval(end($arr)); /** 獲取數據 */ $response = socket_read($this->socket, $dataLen, PHP_BINARY_READ); /** 讀取最后7個字符 /r/nEND/r/n */ socket_read($this->socket, 7, PHP_BINARY_READ); if ($response === false) { $this->throwException(); } return $response; } else { return false; } } /** * 設置所有的鍵過期 * @return boolean success */ public function flushAll() { $data = "flush_all/r/n"; $result = socket_write($this->socket, $data, strlen($data)); /** 讀取返回結果,固定為 OK/r/n */ socket_read($this->socket, 4, PHP_BINARY_READ); return true; }}

3、測試

測試代碼try { $memcache = new MyMemcacheClient(); $memcache->connect(); $memcache->flushAll(); echo "a=", $memcache->get("a"), PHP_EOL; $memcache->set("a", "This is a"); $data = $memcache->get("a"); echo "a: ", $data, PHP_EOL; $memcache->set("a", "This is modified a"); echo "a: ", $memcache->get("a"), PHP_EOL; $memcache->add("b", "This is b"); echo "b: ", $memcache->get("b"), PHP_EOL; $memcache->replace("b", "This is replaced b"); echo "b: ", $memcache->get("b"), PHP_EOL;} catch (MemcacheException $e) { echo $e->getMessage();}測試結果a=a: This is aa: This is modified ab: This is bb: This is replaced b
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
自拍视频国产精品| 亚洲欧美三级伦理| 亚洲最大在线视频| 欧美黄色性视频| 成人国产精品色哟哟| 久久久97精品| 亚洲精品一区av在线播放| 久久视频国产精品免费视频在线| 亚洲国产精彩中文乱码av在线播放| 国产精品视频区| 成人网欧美在线视频| 国产亚洲精品91在线| 9.1国产丝袜在线观看| 精品香蕉在线观看视频一| 狠狠色噜噜狠狠狠狠97| 国产精品吹潮在线观看| 亚洲人在线观看| 一区二区福利视频| 国产精品一区二区三区免费视频| 97香蕉超级碰碰久久免费的优势| 日本老师69xxx| 亚洲最大激情中文字幕| 欧美中文字幕第一页| 欧美日韩精品在线视频| 亚洲精品乱码久久久久久金桔影视| 久久国产精品亚洲| 成人在线免费观看视视频| 亚洲老头同性xxxxx| 久久精品一偷一偷国产| 伊人伊成久久人综合网小说| 日韩在线观看免费网站| 久久精品国产久精国产思思| 91地址最新发布| 欧美一级片在线播放| 美女性感视频久久久| 久久精品视频一| 国产色视频一区| 911国产网站尤物在线观看| 亚洲欧美激情另类校园| 亚洲国产成人在线播放| 78m国产成人精品视频| 久久精品视频在线观看| 日韩av在线影院| 国产精品一久久香蕉国产线看观看| 久久视频在线播放| 久久久久成人精品| 国产ts人妖一区二区三区| 午夜精品理论片| 国产成人自拍视频在线观看| 亚洲日本欧美中文幕| 国内精品久久久久影院优| 国产成+人+综合+亚洲欧美丁香花| 国产69精品久久久久9999| 精品久久久精品| 精品视频在线播放| 国产欧美日韩精品丝袜高跟鞋| 国产精品久久久久一区二区| 北条麻妃在线一区二区| 亚洲成人激情小说| 久久中文字幕国产| 亚洲精品久久久久国产| 亚洲成人久久一区| 成人网页在线免费观看| 欧美大奶子在线| 国产精品av网站| 欧美精品激情视频| www.日韩系列| 国产成人jvid在线播放| 狠狠躁夜夜躁久久躁别揉| 免费成人高清视频| 亚洲乱码一区av黑人高潮| 国产成人精品在线视频| 色综合色综合久久综合频道88| 疯狂欧美牲乱大交777| 国产视频在线一区二区| 亚洲一品av免费观看| 一本色道久久88综合亚洲精品ⅰ| 欧美高清视频免费观看| 色婷婷久久av| 亚洲电影免费观看高清完整版在线观看| 中文字幕少妇一区二区三区| 最近中文字幕mv在线一区二区三区四区| 色伦专区97中文字幕| 日韩中文字幕在线精品| 欧美成人精品在线视频| 亚洲精品有码在线| 亚洲男人天堂九九视频| 91久久在线观看| 日韩av有码在线| 久久久久久亚洲精品中文字幕| 亚洲男人的天堂在线| 色偷偷av一区二区三区| 国产欧美欧洲在线观看| 欧美极品少妇xxxxx| 久久免费视频在线观看| 菠萝蜜影院一区二区免费| 色噜噜国产精品视频一区二区| 亚洲精品中文字| 欧美又大粗又爽又黄大片视频| 精品免费在线视频| 伊人久久久久久久久久| 亚洲国产精品中文| 高跟丝袜欧美一区| 国产精品久久久91| 成人在线国产精品| 日韩色av导航| 日韩欧美国产中文字幕| 亚洲色图激情小说| 国产亚洲欧美日韩精品| 欧美精品久久久久| 欧美精品久久久久| 国产精品成人免费电影| 国产视频久久久| 日韩在线观看免费全| 久久久噜久噜久久综合| 国产视频999| 日韩高清电影好看的电视剧电影| 色七七影院综合| 红桃视频成人在线观看| 狠狠躁夜夜躁人人躁婷婷91| 日韩精品亚洲视频| 亚洲国产成人av在线| 性欧美在线看片a免费观看| 国产欧美精品日韩精品| 在线播放日韩精品| 色先锋久久影院av| 国产精品一区二区久久久久| 91中文字幕一区| 欧美中文在线观看国产| 国产伦精品免费视频| 精品国产欧美一区二区五十路| 日韩中文字幕在线看| 国产不卡在线观看| 欧美国产日本高清在线| 欧美xxxx18性欧美| 国产精品第一第二| 一区二区三区动漫| 国产精品27p| 日韩美女视频中文字幕| 欧美疯狂做受xxxx高潮| 国产成人亚洲精品| 欧美高清自拍一区| 日韩欧美国产高清91| 98精品国产自产在线观看| 亚洲人成在线免费观看| 国产成人精品综合| 久久综合伊人77777| 不卡在线观看电视剧完整版| 久久久久久九九九| 亚洲成人国产精品| 亚洲国产一区二区三区四区| 欧美高清性猛交| 激情久久av一区av二区av三区| 亚洲欧美日韩一区二区在线| 日韩经典中文字幕在线观看| 黑人狂躁日本妞一区二区三区| 国产精品三级在线| 久久99久久99精品中文字幕| 日韩激情av在线播放| 国产亚洲精品久久| 欧美激情成人在线视频| 国产精品久久久久av免费| 久久人人爽人人爽人人片av高请| 亚洲伊人久久大香线蕉av|