HandlerSocket作者:Eugene ,發佈於2012-11-9 |
|
php使用handlersocket詳解有關於
HandlerSocket 的介紹、性能及其安裝,可參考Using SQL as NoSQL。而 PHP
extension for interfacing with MySQL Handler Socket,實際上這裏php-handlersocket有整體的介紹,包括其安裝、使用方法。現在純粹是因爲自己測試時犯了一很基礎的錯誤,所以,罰自己多敲點字。
安裝 [root@localhost php-handlersocket]# /usr/local/php/bin/phpize [root@localhost php-handlersocket]# ./configure --with-php-config=/usr/local/php/bin/php-config [root@localhost php-handlersocket]# make [root@localhost php-handlersocket]# make install 說明: 1 編譯時需要 libhsclient 庫(libhsclient – HandlerSocket client library)。 2 安裝成功時,在 PHP 的 extension dir 生成一名爲 handlersocket.so,將extension=handlersocket.so加入 php.ini, 重啓 PHP 服務。 HandlerSocket Class methods HandlerSocket::construct 創建一 HandlerSocket Object。 HandlerSocket::__construct ( string $host, string $port [, array $options ] ) 參數: $host MySQL 服務器 host name。 $port HandlerSocket 的端口地址。 返回值: 返回 HandlerSocket Object。 HandlerSocket::openIndex 在對數據庫表做任何的增刪改查操作前,必須先選擇一索引。 public bool HandlerSocket::openIndex ( int $id, string $db, string $table, string $index, string $fields ) 參數: $id HandlerSocket ID; 1 SELECT, 2 UPDATE, 3 INSERT, 4 DELETE。 $db 數據庫名 $table 表名 $index 索引名, 可以是手動創建的索引名。這個參數可爲空,一般指定時是用於 SELECT,eg: 指定爲主鍵:HandlerSocket::PRIMARY $fields 字段名(多個字段名,用逗號分隔),可爲空。 返回值: 成功時返回 TRUE, 反之亦然。 HandlerSocket::executeSingle 在表上做增刪改查操作。 public mixed HandlerSocket::executeSingle ( int $id, string $op, array $fields [, int $limit, int $skip, string $modop, array $values, array $filters, int $invalues_key, array $invalues ] ) 參數: $id HandlerSocket ID; 1 SELECT, 2 UPDATE, 3 INSERT, 4 DELETE。 $op 操作符,有如下可選項, ‘=’, ‘>=’, ‘<=’, ‘>’, ‘<’, ‘+’。 $fields 查詢中所用到的字段,數組,其長度必須等於或小於指定的列數。 $limit 最多影響的行數(最開始根據這個函數名稱有在懷疑這個參數,測試時發現,如果存在滿足條件的多條記錄時,會根據這個參數指定的值返回記錄數)。 $skip 在檢索記錄前忽略掉的行數。 $modop 指定修改操作,可選值:’U', ‘D’。 $values 數組,用於做 UPDATE 操作時指定修改的值。 $filters 過濾的選項。 $invalues_key ? (enabled : 0 / disabled : -1). $invalues IN options 返回值: 返回做對應操作時的執行結果。 HandlerSocket::executeMulti 在一次調用中執行多個操作,即多個 HandlerSocket::executeSingle 的合併。 public mixed HandlerSocket::executeMulti ( array $requests ) 參數: $requrest 多組 executeSingle 參數,用數組的形式體現。 注意: 等同於:HandlerSocket::executeSingle($requests00, $requests01, ...), HandlerSocket::executeSingle($requests10, ...) ...。 返回結果: 返回做對應操作時的執行結果。 HandlerSocket::executeUpdate To update a record from a table using an index. public mixed HandlerSocket::executeUpdate ( int $id, string$op, array $fields, array $values [, int $limit, int $skip, array $filters, int $invalues_key, array $invalues ] ) 參數: $id HandlerSocket ID; 2 UPDATE 。 $op 操作符,有如下可選項, ‘=’, ‘>=’, ‘<=’, ‘>’, ‘<’, ‘+’。 $fields 查詢中所用到的字段,數組,其長度必須等於或小於指定的列數。 $values UPDAET 時指定修改的值。 $limit 最多影響的行數。 $skip 在檢索記錄前忽略掉的行數。 $filters 過濾的選項。 $invalues_key ? (enabled : 0 / disabled : -1). $invalues IN options 注意: 等同於:HandlerSocket::executeSingle($id, $op, $fields, $limit, $skip, 'U', $values, $filters, $invalues_key, $invalues)。 返回值: 返回做對應操作時的執行結果。 HandlerSocket::executeDelete To delete a record from a table using an index. public mixed HandlerSocket::executeDelete ( int $id, string $op, array $fields [, int $limit, int $skip, array $filters, int $invalues_key, array $invalues ] ) 參數: $id HandlerSocket ID; 4 DELETE 。 $op 操作符,有如下可選項, ‘=’, ‘>=’, ‘<=’, ‘>’, ‘<’, ‘+’。 $fields 查詢中所用到的字段,數組,其長度必須等於或小於指定的列數。 $limit 最多影響的行數。 $skip 在檢索記錄前忽略掉的行數。 $filters 過濾的選項。 $invalues_key ? (enabled : 0 / disabled : -1). $invalues IN options 注意: 等同於:HandlerSocket::executeSingle($id, $op, $fields, $limit, $skip, 'D', NULL, $filters, $invalues_key, $invalues)。 返回值: 返回做對應操作時的執行結果。 HandlerSocket::executeInsert To insert a record from a table using an index. public mixed HandlerSocket::executeInsert ( int $id, array $values ) 參數: $id HandlerSocket ID; 3 INSERT 。 $values HandlerSocket::openIndex 指定的字段參數所對應的值,但是以數組的形式體現。 注意: 等同於:HandlerSocket::executeSingle($id, '+', $values, 0, 0, NULL, NULL, NULL) ,第三個參數中指定的值必須和在此之前調用 HandlerSocket::openIndex 時第五個參數指定的字段對應。 返回值: 返回做對應操作時的執行結果。 HandlerSocket::getError 取得最近一次的錯誤信息。 public string HandlerSocket::getError ( void ) 返回值: 返回最近的錯誤信息(時間上)。 Example 測試表 schema: CREATE TABLE `hstesttbl` ( `id` int(11) NOT NULL AUTO_INCREMENT, `k` char(6) DEFAULT NULL, `v` char(6) DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_hstesttbl_k` (`k`) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8; $host = 'localhost'; $port = 9998; $port_wr = 9999; $dbname = 'hstestdb'; $table = 'hstesttbl'; //GET $hs = new HandlerSocket($host, $port); if (!($hs->openIndex(1, $dbname, $table, HandlerSocket::PRIMARY, 'k,v'))) { echo $hs->getError(), PHP_EOL; die(); } $retval = $hs->executeSingle(1, '=', array('k1'), 1, 0); var_dump($retval); $retval = $hs->executeMulti( array( array(1, '=', array('k1'), 1, 0), array(1, '=', array('k2'), 1, 0) ) ); var_dump($retval); unset($hs); //UPDATE $hs = new HandlerSocket($host, $port_wr); if (!($hs->openIndex(2, $dbname, $table, '', 'v'))) { echo $hs->getError(), PHP_EOL; die(); } if ($hs->executeUpdate(2, '=', array('k1'), array('V1'), 1, 0) === false) { echo $hs->getError(), PHP_EOL; die(); } unset($hs); //INSERT $hs = new HandlerSocket($host, $port_wr); if (!($hs->openIndex(3, $dbname, $table, '', 'k,v'))) { echo $hs->getError(), PHP_EOL; die(); } if ($hs->executeInsert(3, array('k2', 'v2')) === false) { echo $hs->getError(), PHP_EOL; } if ($hs->executeInsert(3, array('k3', 'v3')) === false) { echo 'A', $hs->getError(), PHP_EOL; } if ($hs->executeInsert(3, array('k4', 'v4')) === false) { echo 'B', $hs->getError(), PHP_EOL; } unset($hs); //DELETE $hs = new HandlerSocket($host, $port_wr); if (!($hs->openIndex(4, $dbname, $table, '', ''))) { echo $hs->getError(), PHP_EOL; die(); } if ($hs->executeDelete(4, '=', array('k2')) === false) { echo $hs->getError(), PHP_EOL; die(); } PS: 因爲建立測試表時忘記指定存儲引擎爲 InnoDB, 測試 INSERT 操作時,怎樣都是失敗。後面爲了驗證問題的出處,用 perl 的 API 做同樣的測試操作,結果也是失敗。查看錶結構後,修改儲存引擎爲 InnoDB,才成功。只是這個問題的錯誤信息太難理解,就幾個數字,在沒找到答案之前,害我還去查看了下 HandlerSocket 的源代碼,當然,沒有從中得到任何的提示。 轉自http://flandycheng.blog.51cto.com/855176/628776/
|
HandlerSocket簡介以及php使用handlersocket
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.