Q4MをCentOS5.4にインストールしphpで実行しました。

Q4Mid:kazuhookuさんが開発したMySQLでメッセージキューを実装するストレージエンジンです。
思わぬ機会でQ4Mに触れる事が出来たので実際に構築〜phpでの実行を記事にしました。

環境

OS:CentOS5.4
MySQL:5.1.43-1
Q4M:q4m-0.9
PHP:5.1.6


インストール

インストールには下記の記事を参考にしました。
Q4M on CentOS - dragon3のブログ

MySQLのバージョンが違うだけで、上記と同じ作業で行いました。

VMwareで環境を構築したのですが、MySQLをビルドするのに物凄く時間がかかるのが注意です。
(4,5時間掛かったかな?)


phpで実行

phpでの実行には下記の記事を参考にしました。
http://blog.xole.net/article.php?id=719


PDOで実行する為に必要な事を下記に示します。

php-pdoのインストール

yum install php-pdo

pdo-mysqlのインストール

pecl pdo_mysql

php.iniの編集

;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
;
; If you wish to have an extension loaded automatically, use the following
; syntax:
;
;   extension=modulename.extension
;
; For example:
;
;   extension=msql.so
;
; Note that it should be the name of the module only; no directory information
; needs to go here.  Specify the location of the extension with the
; extension_dir directive above.

extension=pdo.so
extension=pdo_mysql.so

MySQLのユーザー、パスワードを適当に設定して、参考のphpを実行しました。

<?php
$conn = new PDO('mysql:host=localhost; dbname=hogetest', 'user', 'password');
$wait = $conn->prepare('SELECT queue_wait("hoge_queue", 10)');
$abort = $conn->prepare('SELECT queue_abort()');
$e = $conn->prepare('SELECT queue_end()');
$select = $conn->prepare('SELECT * FROM hoge_queue');

while(true){
    $start = time(); // for epch tstmp

    // wait call query
    $wait->execute();

    $end = time();
    echo 'wait for: ', $end - $start, ' sec.', PHP_EOL;
    echo 'is_queue: ', $wait->fetch(PDO::FETCH_COLUMN), PHP_EOL;

    $select->execute();
    while($row = $select->fetch(PDO::FETCH_OBJ)){
        var_dump($row);
        //
        // delete しなくとも queue_end で消える
        //
        $e->execute();
        continue 2;
    }

    // abort cal
    // abortを実行するとphpエラーが起こるのでコメント化
    //$abort->execute();
    echo 'next...', PHP_EOL, PHP_EOL;
}

無事にQ4Mを楽しむ事が出来ました。


$abort->execute();を実行すると表示されるエラー

[root@localhost ~]# php q4m.php
wait for: 10 sec.
is_queue: 0
PHP Fatal error:  Call to a member function execute() on a non-object in /root/q4m.php on line 29
mysql> SELECT queue_abort();
ERROR 1123 (HY000): Can't initialize function 'queue_abort'; queue_abort(): not in owner mode

むう。。。


まとめ

Q4Mの利点は、プログラムをフロントエンドとバックエンドで分離する事で処理を高速化する事が出来る事だと思います。(他人の受け売りです。)
構築〜実装が複雑では無いので、どんどん取り入れたい技術だと思います。
(唯、SELECT queue_abort()が実行出来なかったのは仕様なのか、構築時のミスなのか気になるところです…。)


追記

Q4Mの構築自体に問題は無さそうですが、スクリプトに問題がありそう。現在調査中。
なんだか2回目のwhileに絶対入らない…。PDO内のスクリプトにバグがあるのかな…。
MySQL内では問題なかった…。


[PR]Spreeの情報を集めています。

ECを持ちたい方、仕事でECを使いたい方向けのコミュニティサイトです。
このサイトでは世界で最も使用されているECの1つであるSpreeについての情報を提供しています。
http://spreecommerce.jp/