MySQL HandlerSocket Plugin for PHP

如果要用 PHP 透過 HandlerSocket 存取 MySQL ,必須先安裝好 php-handlersocket 這個 PHP Extension ,在 Debian Squeeze 安裝 MySQL HandlerSocket Plugin 有提到安裝方法,安裝完之後有以下 function 可以用。

有鑑於 php-handlersocket 提供的 function 使用起來不是很直覺,所以我寫了一個 wrapper 方便使用,以下是範例,首先必須先建立一個資料表:

接下來就可以開使用程式把上面的 MySQL Storage Engine (InnoDB) 當成 NoSQL DB 使用了。你可以直接用 php-handlersocket 這個 extension 本身提供的 PHP function 來寫,或是用我寫的 php-handlersocket-wrapper,來簡化操作。

以下程式,是 php-handlersocket-wrapper 的範例,可以從這邊下載

非常簡單好用,不過也看到了缺點…目前看來沒有認證機制。

Posted in Programming
2 comments on “MySQL HandlerSocket Plugin for PHP
  1. mic says:

    可以問一下為什麼要有 $indexid 嗎?這是auto increase id?

  2. roga says:

    Hi, Mic

    index id 的作用,並不是 AUTO INCREMENT 的 id ,這個問題一開始我也覺得很疑惑,後來在寫 wrapper 的時候,查文件才知道 HandlerSocket plugin 在開啟連線的時候,會根據這組 index id 來決定要開啟的欄位,假設 index id 是 1 的時候,

    [sourcecode lang=”php”]

    $indexid = 1;
    $hsw->init(array(‘user_id’, ‘user_name’, ‘user_email’), $indexid);

    [/sourcecode]

    這樣代表 index id = 1 的這個連線,會存取(有沒有寫入取決於是不是用 write port ) user_id, user_name, user_email 這三個欄位 ,

    [sourcecode lang=”php”]

    $hsw->init(array(‘user_name’, ‘user_email’), $indexid + 1);

    [/sourcecode]

    則是代表 index id = 2 的這個連線,會存取 user_name, user_email 這兩個欄位 ,所以和上一個 index id = 1 的連線相比,在拿或是寫的時候,這個連線不會碰到 user_id 的欄位。

    可以用下面這個方法:

    [sourcecode lang=”php”]

    $hs1 = new HandlerScoketWrapper($db_host, $port, $dbname, $table);
    $hs1->init(array(‘user_id’, ‘user_email’), $indexid);

    $hs2 = new HandlerScoketWrapper($db_host, $port, $dbname, $table);
    $hs2->init(array(‘user_name’, ‘user_email’), $indexid);

    [/sourcecode]

    建立不同的連線,以進行最佳化。

    /**
    * https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL/blob/master/docs-en/protocol.en.txt
    * …
    * Once an ‘open_index’ request is issued, the HandlerSocket plugin opens the
    * specified index and keep it open until the client connection is closed. Each
    * open index is identified by “indexid”. If “indexid” is already open, the old
    * open index is closed. You can open the same combination of “dbname”
    * “tablename” “indexname” multple times, possibly with different “columns”.
    * For efficiency, keep “indexid” small as far as possible.
    * …
    *
    */

Leave a Reply

Your email address will not be published.