btoメモ

なんか適当に書く

pseudoQueue作った(PHP)

メッセージキューとは

異なる処理の間でキューを用いてメッセージ交換を行う仕組みのことです。

生産者(キューを登録する)側は単純にキューに対してメッセージを追加します。

消費者(キューを消費する)側は単純にキューからメッセージを取り出して処理を行います。

PerlだとTheShwartzやGearmanが有名。

身近なところではcodereposでTheShwartzが使われています

PHPでやるには

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

秋元@サイボウズラボ・プログラマー・ブログ: 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拡張がなくてもそれなりに動作するはずです。