国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > PHP > 正文

用PHP實(shí)現(xiàn)memcache客戶(hù)端(續(xù))

2019-11-08 18:53:21
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

1、說(shuō)明

睡了一覺(jué),回想了下昨天的代碼,發(fā)現(xiàn)有些地方寫(xiě)得不好:

出現(xiàn)錯(cuò)誤時(shí)不必拋出異常,免得打斷了正常的執(zhí)行流程,而是僅僅記錄錯(cuò)誤信息,把異常交給使用者處理,這樣更靈活socket_create, socket_read, socket_write都有可能出現(xiàn)網(wǎng)絡(luò)錯(cuò)誤,有的代碼沒(méi)有去處理這些可能的錯(cuò)誤沒(méi)有提供關(guān)閉連接的函數(shù)創(chuàng)建socket的動(dòng)作應(yīng)該放在connect函數(shù)中

本次修改除了修正以上不足之外,還增加了delete, incr, decr, stats命令。

本代碼根據(jù) memcached協(xié)議中文版一文所述內(nèi)容編寫(xiě),在本機(jī)上測(cè)試通過(guò),感謝作者翻譯!!

2、代碼

class MyMemcacheClient { PRivate $host; private $port; private $socket; private $error; public function __construct() { } public function __destruct() { $this->close(); } /** * 獲取最后一次的socket錯(cuò)誤 * @return string 最后一次socket錯(cuò)誤字符串 */ public function setSocketError() { $errno = socket_last_error($this->socket); $this->error = "[$errno]" . socket_strerror($errno); } /** * 獲取最后一次錯(cuò)誤信息; * @return string 最后一次錯(cuò)誤信息 */ public function getLastError() { return $this->error; } /** * 鏈接memcached服務(wù)器 * @param string $host memcached監(jiān)聽(tīng)的ip * @param integer $port memcached監(jiān)聽(tīng)的端口 * @return boolean true表示連接成功,false表示連接失敗 */ public function connect($host = '127.0.0.1', $port = 11211) { $this->host = $host; $this->port = $port; $this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($this->socket === false) { $this->setSocketError(); return false; } $result = socket_connect($this->socket, $host, $port); if ($result === false) { $this->setSocketError(); return false; } else { return true; } } /** * 執(zhí)行set|add|replace命令 * @param string $cmd 命令(set|add|replace) * @param string $key 鍵 * @param string $value 值 * @param nteger $ttl 生存時(shí)間 * @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->setSocketError(); return false; } $response = socket_read($this->socket, 1024, php_NORMAL_READ); /** 讀取最后一個(gè) /n 字符 */ socket_read($this->socket, 1, PHP_BINARY_READ); if ($response === false) { $this->setSocketError(); return false; } /** 操作成功會(huì)返回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); } /** * 獲取一個(gè)鍵的值 * @param string $key 鍵 * @return string|boolean 值, false表示沒(méi)有這個(gè)鍵或者已過(guò)期 */ public function get($key) { $data = sprintf("get %s/r/n", $key); $result = socket_write($this->socket, $data, strlen($data)); if ($result === false) { $this->setSocketError(); return false; } $line1 = socket_read($this->socket, 1024, PHP_NORMAL_READ); /** 讀取最后一個(gè) /n 字符 */ socket_read($this->socket, 1, PHP_BINARY_READ); if ($line1 === false) { $this->setSocketError(); return false; } /** 獲取成功,第一行返回 VALUE <key> <flags> <bytes>/r/n */ if (!strncmp($line1, "VALUE", 5)) { $line1 = rtrim($line1, "/r/n"); $arr = explode(' ', $line1); /** 獲取數(shù)據(jù)長(zhǎng)度 */ $dataLen = intval(end($arr)); /** 獲取數(shù)據(jù) */ $response = socket_read($this->socket, $dataLen, PHP_BINARY_READ); /** 讀取最后7個(gè)字符 /r/nEND/r/n */ socket_read($this->socket, 7, PHP_BINARY_READ); if ($response === false) { $this->setSocketError(); return false; } return $response; } else { return false; } } /** * 設(shè)置所有的鍵過(guò)期 * @return boolean success */ public function flushAll() { $data = "flush_all/r/n"; $result = socket_write($this->socket, $data, strlen($data)); /** 讀取返回結(jié)果,固定為 OK/r/n */ socket_read($this->socket, 4, PHP_BINARY_READ); return true; } /** * 刪除一個(gè)鍵 * @param string $key 鍵 * @param integer $delay 延時(shí) * @return boolean true for success, false for fail */ public function delete($key, $delay = 5) { $data = sprintf("delete %s %d/r/n", $key, $delay); $result = socket_write($this->socket, $data, strlen($data)); if ($result === false) { $this->setSocketError(); return false; } $response = socket_read($this->socket, 20, PHP_NORMAL_READ); if ($response === false) { $this->setSocketError(); return false; } socket_read($this->socket, 1, PHP_BINARY_READ); if (!strncmp($response, "DELETED", 7)) { return true; } else { return false; } } /** * incr,decr命令的封裝 * @param string $cmd 操作,incr|decr * @param string $key 鍵 * @param integer $value 增加或減少的值 * @return boolean|integer 操作失敗,返回false,操作成功,返回整數(shù)(操作后的值) */ private function _incr_decr($cmd, $key, $value) { $data = "$cmd $key $value/r/n"; $result = socket_write($this->socket, $data, strlen($data)); if ($result === false) { $this->setSocketError(); return false; } $response = socket_read($this->socket, 1024, PHP_NORMAL_READ); if ($response === false) { $this->setSocketError(); return false; } socket_read($this->socket, 1, PHP_BINARY_READ); if ($response != "NOT_FOUND/r") { return intval($response); } else { return false; } } public function incr($key, $value = 1) { return $this->_incr_decr("incr", $key, $value); } public function decr($key, $value = 1) { return $this->_incr_decr("decr", $key, $value); } /** * 返回統(tǒng)計(jì)信息 * @return boolean|array 失敗,返回false,成功,返回?cái)?shù)組,格式 key => value */ public function stats() { $data = $arg ? "stats $arg/r/n" : "stats/r/n"; $result = socket_write($this->socket, $data, strlen($data)); if ($result === false) { $this->setSocketError(); return false; } $stats = []; while(true) { $line = socket_read($this->socket, 1024, PHP_NORMAL_READ); if (false === $line) { break; } if ($line == "END/r") { socket_read($this->socket, 1, PHP_BINARY_READ); break; } else { $arr = explode(' ', rtrim($line, "/r")); $stats[$arr[1]] = $arr[2]; socket_read($this->socket, 1, PHP_BINARY_READ); } } return $stats; } /** * 關(guān)閉連接 * @return void 沒(méi)有返回值 */ public function close() { $this->socket && socket_close($this->socket); }}

3、測(cè)試

測(cè)試代碼try { $memcache = new MyMemcacheClient(); if (false === $memcache->connect()) { throw new Exception("connect to memcached failed: " . $memcache->getlastError()); } $memcache->flushAll(); echo "a=", $memcache->get("a"), PHP_EOL; if (false === $memcache->set("a", "This is a")) { echo "set a failed: ", $memcache->getLastError(), PHP_EOL; } else { echo "a: ", $memcache->get("a"), PHP_EOL; } $memcache->set('total', 10, 30); echo "total: ", $memcache->get("total"), PHP_EOL; $memcache->incr("total", 2); echo "total: ", $memcache->get("total"), PHP_EOL; $memcache->decr("total", 1); echo "total: ", $memcache->get("total"), PHP_EOL; if (false === $memcache->delete("total")) { echo "delete total failed", PHP_EOL; } else { echo "delete total success! total: ", $memcache->get("total"), PHP_EOL; } $stats = $memcache->stats(); foreach($stats as $k => $v) { echo $k,": ", $v, PHP_EOL; } $memcache->close();} catch (Exception $e) { echo $e->getMessage();}測(cè)試結(jié)果a=a: This is atotal: 10total: 12total: 11delete total success! total: pid: 11812uptime: 2890time: 1487218922version: 1.2.6pointer_size: 32curr_items: 2total_items: 60bytes: 115curr_connections: 3total_connections: 33connection_structures: 4cmd_get: 154cmd_set: 60get_hits: 120get_misses: 34evictions: 0bytes_read: 4196bytes_written: 8247limit_maxbytes: 134217728threads: 1
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 会东县| 怀安县| 如东县| 屏东县| 宁国市| 临澧县| 枣强县| 揭西县| 和硕县| 饶阳县| 阳高县| 城口县| 眉山市| 高尔夫| 安平县| 年辖:市辖区| 凤山县| 高尔夫| 临安市| 类乌齐县| 荔浦县| 福清市| 长顺县| 阳原县| 黄大仙区| 新安县| 大埔区| 临沧市| 贵南县| 广河县| 洛隆县| 凭祥市| 达拉特旗| 丰县| 郑州市| 祥云县| 曲周县| 海城市| 青浦区| 浦北县| 禹州市|