pseudoQueue作った(PHP)

| | トラックバック(0)

メッセージキューとは

異なる処理の間でキューを用いてメッセージ交換を行う仕組みのことです。
生産者(キューを登録する)側は単純にキューに対してメッセージを追加します。
消費者(キューを消費する)側は単純にキューからメッセージを取り出して処理を行います。

PerlだとTheShwartzやGearmanが有名。
身近なところではcodereposでTheShwartzが使われています

PHPでやるには

akkyさんがJavaのActiveMQを使う方法を紹介してくれてます。

秋元@サイボウズラボ・プログラマー・ブログ: PHPでメッセージキューを使う

pseudoQueue作った

もっと簡単にできないかなと思って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拡張がなくてもそれなりに動作するはずです。

トラックバック(0)

このブログ記事を参照しているブログ一覧: pseudoQueue作った(PHP)

このブログ記事に対するトラックバックURL: http://blog.bz2.jp/bz2mt/mt-tb.cgi/263

ウェブページ

Powered by Movable Type 4.21-ja

このブログ記事について

このページは、masatoが2008年5月 5日 19:43に書いたブログ記事です。

ひとつ前のブログ記事は「singleExecutionで強制終了した場合でも大丈夫なように修正」です。

次のブログ記事は「Mac OS XでCHMファイルを見れるようにxchmをインストールした」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。