Mysql插件HandlerSocket的應用

一.安裝HandlerSocket php

1.下載 mysql

http://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL git

獲取 ahiguti-HandlerSocket-Plugin-for-MySQL-1.0.6-71-g159ea6d.tar.gzgithub

上傳到LINUX目錄/usr/local/src/ 下sql

2.安裝 app

cd /usr/local/src/socket

tar zvfx ahiguti-HandlerSocket-Plugin-for-MySQL-1.0.6-71-g159ea6d.tar.gztcp

cd ahiguti-HandlerSocket-Plugin-for-MySQL-159ea6d/ui

./autogen.shgoogle

./configure --with-mysql-source=/usr/local/src/mysql-5.1.47 --with-mysql-binddir=/usr/local/app/mysql/bin/ --with-mysql-plugindir=/usr/local/app/mysql/lib/mysql/plugin/ --prefix=/usr/local/app/mysql

其中

--with-mysql-source    MYSQL源碼目錄

--with-mysql-binddir    MYSQL安裝後的BIN目錄

--with-mysql-plugindir MYSQL安裝後PLUGIN的目錄

(***************小插曲************************

筆者在configure的時候遇到的問題:

checking mysql source... yes: Using /usr/local/src/mysql-5.1.47, version 5.1.47
checking for mysql_config... /usr/bin/mysql_config
checking mysql binary... yes: Using /usr/bin/mysql_config, version 5.0.77
configure: error: MySQL source version does not match MySQL binary version

是默認的/usr/bin/mysql_config與mysql-5.1.47源碼版本不同,因此作一下補充:

cp /usr/local/app/mysql/bin/mysql_config /usr/bin/mysql_config

************************************************************)

編譯安裝:

make;make install

添加配置

vi /etc/my.cnf

增長以下選項:

[mysqld] 
loose_handlersocket_port = 9998   
# the port number to bind to (for read requests) 
loose_handlersocket_port_wr = 9999   
# the port number to bind to (for write requests) 
loose_handlersocket_threads = 16   
# the number of worker threads (for read requests) 
loose_handlersocket_threads_wr = 1   
# the number of worker threads (for write requests) 
open_files_limit = 65535   
# to allow handlersocket accept many concurrent   
# connections, make open_files_limit as large as   
# possible.

而後使用root登陸MYSQL

mysql -u root -h localhost -p

在MYSQL控制檯中執行命令

mysql> install plugin handlersocket soname 'handlersocket.so';

若是執行成功,能夠看到9998 9999 端口已經啓動

# netstat -ln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State     
tcp        0      0 0.0.0.0:997                 0.0.0.0:*                   LISTEN     
tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN     
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN     
tcp        0      0 0.0.0.0:9998                0.0.0.0:*                   LISTEN     
tcp        0      0 0.0.0.0:9999                0.0.0.0:*                   LISTEN
     
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN     
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN     
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN     
tcp        0      0 :::22                       :::*                        LISTEN     
udp        0      0 0.0.0.0:50187               0.0.0.0:*                              
udp        0      0 0.0.0.0:991                 0.0.0.0:*                              
udp        0      0 0.0.0.0:994                 0.0.0.0:*                              
udp        0      0 0.0.0.0:5353                0.0.0.0:*                              
udp        0      0 0.0.0.0:111                 0.0.0.0:*                              
udp        0      0 :::43696                    :::*                                   
udp        0      0 :::5353                     :::*   

安裝完畢。不須要修改mysql的源代碼。
mysql須要5.1或者之後版本。

2、安裝PHP的handlerSocket擴展

1.下載源碼

http://code.google.com/p/php-handlersocket/downloads/detail?name=php-handlersocket-0.0.7.tar.gz

2.安裝

cd /usr/local/src/

tar zvfx php-handlersocket-0.0.7.tar.gz

cd php-handlersocket

/usr/local/bin/phpize
./configure --with-handlersocket --with-php-config=/usr/local/bin/php-config --with-handlersocket-includedir=/usr/local/app/mysql/include/handlersocket/

make LDFLAGS='-L/usr/local/app/mysql/lib' ;

make install

3、使用PHP handlersocket的API

實例化:
  /*
   * String  $host:MySQL ip;
   * String  $port:handlersocket插件的監聽端口,它有兩個端口可選:一個用於讀、一個用於寫
   */
  $hs = new HandlerSocket($host, $port);

  打開一個數據表:
  /*
   * Int       $index:這個數字至關於文件操做裏的句柄,HandlerSocket的全部其餘方法都會依據這個數字來操做由這個   openIndex打開的表,
   * String  $dbname:庫名
   * String  $table:表名
   * String  $key:表的「主鍵」(HandlerSocket::PRIMARY)或「索引名」做爲搜索關鍵字段,這就是說表必須有主鍵或索引
   *                 我的理解:要被當作where條件的key字段,這樣能夠認爲handlersocket只有一個where條件
   * String  $column:'column1,column2' 所打開表的字段(以逗號隔開),就是說$table表的其餘字段不會被操做
   */
  $hs->openIndex($index, $dbname, $table, $key, $column);

  查詢:
  /*
   * Int     $index: openIndex()所用的$index
   * String  $operation:openIndex方法中指定的$key字段所用的操做符,目前支持'=', '>=', '<=', '>',and '<';能夠理解爲where條件
   * Array   $value
   * Int       $number(默認是1):獲取結果的最大條數;至關於SQL中limit的第二個參數
   * Int     $skip(默認是0):跳過去幾條;至關於SQL中limit的第一個參數
   */
  $retval = $hs->executeSingle($index, $operation, $value, $number, $skip);

  插入(注意:此處的openIndex要用$port_wr,即讀寫端口):
  /*
   * Int     $index: openIndex()所用的$index
   * Array   $arr:數字元素數與openIndex的$column相同
   */
  $retval = $hs->executeInsert($index, $arr);

  刪除(注意:此處的openIndex要用$port_wr,即讀寫端口):
  /*
   * Int     $index: openIndex()所用的$index
   * String  $operation:openIndex方法中指定的$key字段所用的操做符,目前支持'=', '>=', '<=', '>',and '<';能夠理解爲where條件
   * Array   $value
   * Int     $number(默認是1):獲取結果的最大條數;至關於SQL中limit的第二個參數
   * Int     $skip(默認是0):跳過去幾條;至關於SQL中limit的第一個參數
   */
  $retval = $hs->executeDelete($index, $operation, $value, $number, $skip);

  更新(注意:此處的openIndex要用$port_wr,即讀寫端口):
  /*
   * Int     $index: openIndex()所用的$index
   * String  $operation:openIndex方法中指定的$key字段所用的操做符,目前支持'=', '>=', '<=', '>',and '<';能夠理解爲where條件
   * Array   $value
   * Int       $number(默認是1):獲取結果的最大條數;至關於SQL中limit的第二個參數
   * Int     $skip(默認是0):跳過去幾條;至關於SQL中limit的第一個參數
   */
  $retval = $hs->executeUpdate($index, $operation, $value, $number, $skip);

示例:

<?php


$host = 'localhost';
$port = 9998;
$port_wr = 9999;
$dbname = 'discuz';

$table = 'cdb_members';

$hs = new HandlerSocket($host, $port);
if (!($hs->openIndex(0, $dbname, $table, "username", 'uid,username,password,gender'))) {    echo $hs->getError(), PHP_EOL;     die(); }

$retval = $hs->executeSingle(0, '=', array('吉祥二寶'), 10, 0);  var_dump($retval);

?>

相關文章
相關標籤/搜索