InBlock.gif有关于 HandlerSocket 的介绍、性能及其安装,可参考Using SQL as NoSQL。而 PHP extension for interfacing with MySQL Handler Socket,实际上这里php-handlersocket有整体的介绍,包括其安装、使用方法。现在纯粹是因为自己测试时犯了一很基础的错误,所以,罚自己多敲点字。
InBlock.gif安装
InBlock.gif  
InBlock.gif[root@localhost php-handlersocket]# /usr/local/php/bin/phpize
InBlock.gif[root@localhost php-handlersocket]# ./configure --with-php-config=/usr/local/php/bin/php-config
InBlock.gif[root@localhost php-handlersocket]# make
InBlock.gif[root@localhost php-handlersocket]# make install
InBlock.gif说明:
InBlock.gif1 编译时需要 libhsclient 库(libhsclient – HandlerSocket client library)。
InBlock.gif2 安装成功时,在 PHP 的 extension dir 生成一名为 handlersocket.so,将extension=handlersocket.so加入 php.ini, 重启 PHP 服务。
InBlock.gifHandlerSocket Class methods
InBlock.gifHandlerSocket::construct
InBlock.gif创建一 HandlerSocket Object。
InBlock.gif  
InBlock.gifHandlerSocket::__construct ( string $host, string $port [,    array $options ] )
InBlock.gif参数:
InBlock.gif
        $host MySQL 服务器 host name。
InBlock.gif        $port HandlerSocket 的端口地址。
InBlock.gif
返回值:
InBlock.gif返回 HandlerSocket Object。
InBlock.gifHandlerSocket::openIndex
InBlock.gif在对数据库表做任何的增删改查操作前,必须先选择一索引。
InBlock.gif  
InBlock.gifpublic bool HandlerSocket::openIndex ( int $id, string $db, string $table, string $index, string $fields )
InBlock.gif参数:
InBlock.gif
        $id HandlerSocket ID; 1 SELECT, 2 UPDATE, 3 INSERT, 4 DELETE。
InBlock.gif        $db 数据库名
InBlock.gif        $table 表名
InBlock.gif        $index 索引名, 可以是手动创建的索引名。这个参数可为空,一般指定时是用于 SELECT,eg: 指定为主键:HandlerSocket::PRIMARY
InBlock.gif        $fields 字段名(多个字段名,用逗号分隔),可为空。
InBlock.gif
返回值:
InBlock.gif成功时返回 TRUE, 反之亦然。
InBlock.gifHandlerSocket::executeSingle
InBlock.gif在表上做增删改查操作。
InBlock.gif  
InBlock.gifpublic mixed HandlerSocket::executeSingle ( int $id, string $op, array $fields [, int $limit, int $skip, string $modop, array $values, array $filters, int $invalues_key, array $invalues ] )
InBlock.gif参数:
InBlock.gif
        $id HandlerSocket ID; 1 SELECT, 2 UPDATE, 3 INSERT, 4 DELETE。
InBlock.gif        $op 操作符,有如下可选项, ‘=’, ‘>=’, ‘<=’, ‘>’, ‘<’, ‘+’。
InBlock.gif        $fields 查询中所用到的字段,数组,其长度必须等于或小于指定的列数。
InBlock.gif        $limit 最多影响的行数(最开始根据这个函数名称有在怀疑这个参数,测试时发现,如果存在满足条件的多条记录时,会根据这个参数指定的值返回记录数)。
InBlock.gif        $skip 在检索记录前忽略掉的行数。
InBlock.gif        $modop 指定修改操作,可选值:’U', ‘D’。
InBlock.gif        $values 数组,用于做 UPDATE 操作时指定修改的值。
InBlock.gif        $filters 过滤的选项。
InBlock.gif        $invalues_key ? (enabled : 0 / disabled : -1).
InBlock.gif        $invalues IN options
InBlock.gif
返回值:
InBlock.gif返回做对应操作时的执行结果。
InBlock.gifHandlerSocket::executeMulti
InBlock.gif在一次调用中执行多个操作,即多个 HandlerSocket::executeSingle 的合并。
InBlock.gif  
InBlock.gifpublic mixed HandlerSocket::executeMulti ( array $requests )
InBlock.gif参数:
InBlock.gif
        $requrest 多组 executeSingle 参数,用数组的形式体现。
InBlock.gif
注意:
InBlock.gif等同于:HandlerSocket::executeSingle($requests00, $requests01, ...), HandlerSocket::executeSingle($requests10, ...) ...。
InBlock.gif返回结果:
InBlock.gif返回做对应操作时的执行结果。
InBlock.gifHandlerSocket::executeUpdate
InBlock.gifTo update a record from a table using an index.
InBlock.gif  
InBlock.gifpublic mixed HandlerSocket::executeUpdate ( int $id, string$op, array $fields, array $values [, int $limit, int $skip, array $filters, int $invalues_key, array $invalues ] )
InBlock.gif参数:
InBlock.gif
        $id HandlerSocket ID; 2 UPDATE 。
InBlock.gif        $op 操作符,有如下可选项, ‘=’, ‘>=’, ‘<=’, ‘>’, ‘<’, ‘+’。
InBlock.gif        $fields 查询中所用到的字段,数组,其长度必须等于或小于指定的列数。
InBlock.gif        $values UPDAET 时指定修改的值。
InBlock.gif        $limit 最多影响的行数。
InBlock.gif        $skip 在检索记录前忽略掉的行数。
InBlock.gif        $filters 过滤的选项。
InBlock.gif        $invalues_key ? (enabled : 0 / disabled : -1).
InBlock.gif        $invalues IN options
InBlock.gif
注意:
InBlock.gif等同于:HandlerSocket::executeSingle($id, $op, $fields, $limit, $skip, 'U', $values, $filters, $invalues_key, $invalues)。
InBlock.gif返回值:
InBlock.gif返回做对应操作时的执行结果。
InBlock.gifHandlerSocket::executeDelete
InBlock.gifTo delete a record from a table using an index.
InBlock.gif  
InBlock.gifpublic mixed HandlerSocket::executeDelete ( int $id, string $op, array $fields [, int $limit, int $skip, array $filters, int $invalues_key, array $invalues ] )
InBlock.gif参数:
InBlock.gif
        $id HandlerSocket ID; 4 DELETE 。
InBlock.gif        $op 操作符,有如下可选项, ‘=’, ‘>=’, ‘<=’, ‘>’, ‘<’, ‘+’。
InBlock.gif        $fields 查询中所用到的字段,数组,其长度必须等于或小于指定的列数。
InBlock.gif        $limit 最多影响的行数。
InBlock.gif        $skip 在检索记录前忽略掉的行数。
InBlock.gif        $filters 过滤的选项。
InBlock.gif        $invalues_key ? (enabled : 0 / disabled : -1).
InBlock.gif        $invalues IN options
InBlock.gif
注意:
InBlock.gif等同于:HandlerSocket::executeSingle($id, $op, $fields, $limit, $skip, 'D', NULL, $filters, $invalues_key, $invalues)。
InBlock.gif返回值:
InBlock.gif返回做对应操作时的执行结果。
InBlock.gifHandlerSocket::executeInsert
InBlock.gifTo insert a record from a table using an index.
InBlock.gif  
InBlock.gifpublic mixed HandlerSocket::executeInsert ( int $id, array $values )
InBlock.gif参数:
InBlock.gif
        $id HandlerSocket ID; 3 INSERT 。
InBlock.gif        $values HandlerSocket::openIndex 指定的字段参数所对应的值,但是以数组的形式体现。
InBlock.gif
注意:
InBlock.gif等同于:HandlerSocket::executeSingle($id, '+', $values, 0, 0, NULL, NULL, NULL) ,第三个参数中指定的值必须和在此之前调用 HandlerSocket::openIndex 时第五个参数指定的字段对应。
InBlock.gif返回值:
InBlock.gif返回做对应操作时的执行结果。
InBlock.gifHandlerSocket::getError
InBlock.gif取得最近一次的错误信息。
InBlock.gif  
InBlock.gifpublic string HandlerSocket::getError ( void )
InBlock.gif返回值:
InBlock.gif返回最近的错误信息(时间上)。
InBlock.gif
Example
InBlock.gif
测试表 schema:
InBlock.gif
    
InBlock.gifCREATE TABLE `hstesttbl` (        `id` int(11) NOT NULL AUTO_INCREMENT,    
InBlock.gif        `k` char(6) DEFAULT NULL,
InBlock.gif        `v` char(6) DEFAULT NULL,
InBlock.gif        PRIMARY KEY (`id`),
InBlock.gif        KEY `idx_hstesttbl_k` (`k`)
InBlock.gif) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
InBlock.gif

InBlock.gif
    
InBlock.gif$host                         = 'localhost';
InBlock.gif$port                         = 9998;
InBlock.gif$port_wr                = 9999;
InBlock.gif$dbname                 = 'hstestdb';
InBlock.gif$table                        = 'hstesttbl';
InBlock.gif
//GET
InBlock.gif$hs = new HandlerSocket($host, $port);
InBlock.gifif (!($hs->openIndex(1, $dbname, $table, HandlerSocket::PRIMARY, 'k,v'))) {
InBlock.gif                echo $hs->getError(), PHP_EOL;
InBlock.gif                die();
InBlock.gif}
InBlock.gif
$retval = $hs->executeSingle(1, '=', array('k1'), 1, 0);
InBlock.gifvar_dump($retval);
InBlock.gif
$retval = $hs->executeMulti(
InBlock.gif                array(
InBlock.gif                                array(1, '=', array('k1'), 1, 0),
InBlock.gif                                array(1, '=', array('k2'), 1, 0)
InBlock.gif                )
InBlock.gif);
InBlock.gifvar_dump($retval);
InBlock.gifunset($hs);
InBlock.gif
//UPDATE
InBlock.gif$hs = new HandlerSocket($host, $port_wr);
InBlock.gifif (!($hs->openIndex(2, $dbname, $table, '', 'v'))) {
InBlock.gif                echo $hs->getError(), PHP_EOL;
InBlock.gif                die();
InBlock.gif}
InBlock.gif
if ($hs->executeUpdate(2, '=', array('k1'), array('V1'), 1, 0) === false) {
InBlock.gif                echo $hs->getError(), PHP_EOL;
InBlock.gif                die();
InBlock.gif}
InBlock.gif
unset($hs);
InBlock.gif
//INSERT
InBlock.gif$hs = new HandlerSocket($host, $port_wr);
InBlock.gifif (!($hs->openIndex(3, $dbname, $table, '', 'k,v'))) {
InBlock.gif                echo $hs->getError(), PHP_EOL;
InBlock.gif                die();
InBlock.gif}
InBlock.gif
if ($hs->executeInsert(3, array('k2', 'v2')) === false) {
InBlock.gif                echo $hs->getError(), PHP_EOL;
InBlock.gif}
InBlock.gifif ($hs->executeInsert(3, array('k3', 'v3')) === false) {
InBlock.gif                echo 'A', $hs->getError(), PHP_EOL;
InBlock.gif}
InBlock.gifif ($hs->executeInsert(3, array('k4', 'v4')) === false) {
InBlock.gif                echo 'B', $hs->getError(), PHP_EOL;
InBlock.gif}
InBlock.gif
unset($hs);
InBlock.gif
//DELETE
InBlock.gif$hs = new HandlerSocket($host, $port_wr);
InBlock.gifif (!($hs->openIndex(4, $dbname, $table, '', ''))) {
InBlock.gif                echo $hs->getError(), PHP_EOL;
InBlock.gif                die();
InBlock.gif}
InBlock.gif
if ($hs->executeDelete(4, '=', array('k2')) === false) {
InBlock.gif                echo $hs->getError(), PHP_EOL;
InBlock.gif                die();
InBlock.gif}
InBlock.gif  
InBlock.gifPS: 因为建立测试表时忘记指定存储引擎为 InnoDB, 测试 INSERT 操作时,怎样都是失败。后面为了验证问题的出处,用 perl 的 API 做同样的测试操作,结果也是失败。查看表结构后,修改储存引擎为 InnoDB,才成功。只是这个问题的错误信息太难理解,就几个数字,在没找到答案之前,害我还去查看了下 HandlerSocket 的源代码,当然,没有从中得到任何的提示。