pseudoQueue作った(PHP)
メッセージキューとは
異なる処理の間でキューを用いてメッセージ交換を行う仕組みのことです。
生産者(キューを登録する)側は単純にキューに対してメッセージを追加します。
消費者(キューを消費する)側は単純にキューからメッセージを取り出して処理を行います。
PerlだとTheShwartzやGearmanが有名。
身近なところではcodereposでTheShwartzが使われています。
PHPでやるには
akkyさんがJavaのActiveMQを使う方法を紹介してくれてます。
秋元@サイボウズラボ・プログラマー・ブログ: PHPでメッセージキューを使う
pseudoQueue作った
もっと簡単にできないかなと思ってpseudoQueueというクラスを作ってみました。
pseudoQueueの特徴
- 必要なのはsqliteのみ(ほとんどの環境で動く)
- PHP4でもPHP5でも動く
- デーモン不要
- webアプリに組み込むだけですぐに使える
使い方
requireして、pseudoQueueを継承したクラスを定義する。
require_once('pseudoQueue.php');
class myPseudoQueue extends pseudoQueue
{
}
生産者側
sendメソッドを使うとキューにメッセージを登録できます。
$queue = new myPseudoQueue();
$queue->send('foo', 'bar');
消費者側
継承したクラスでsubscriberメソッドを上書きします。
キューにメッセージが登録されると順番にキューからメッセージを取り出して、subscriberが呼び出されます。
class myPseudoQueue extends pseudoQueue
{
// overwrite subscriber method
function subscriber($key, $message)
{
echo "key: {$key}, message: {$message}\n";
flush(); @ob_flush();
}
}
仕組み
インスタンスを生成したプロセスが終了した時点で、消費者プロセスを生成します。
なので、消費者側のプログラムを書く必要はなくて、subscriberメソッドを上書きするだけですみます。
堅牢性
消費者プロセスはsingleExecutionクラスを使っているので、複数プロセスが生成されることはありません。
また、仮にプロセスが落ちてもすぐに消費者プロセスは復活します。
消費者プロセスの生成
消費者プロセスの生成には pcntl_fork() を使っています。
なので、pcntl拡張が必要です。
pcntl拡張がない場合は、その場でキューを取り出して処理を実行しようとするので、pcntl拡張がなくてもそれなりに動作するはずです。