棚からパルチャギ

日々の雑記、ニュース拾いとか

2008. 12. 15

openpear/Net_Q4M

Q4MのPHPインターフェースラッパを書いたのでopenpear.orgで公開してみました。

基本的な使い方はこんな感じで。

$queue = new Net_Q4M(); $queue->connect('mysql://user:pass@localhost:3306/database'); $row = $queue->dequeue('my_queue'); if (process_row($row)) { $queue->end(); } else { $queue->abort(); } $queue->disconnect();
dequeue()を呼ぶとキューのレコード情報が返ります。 内部的にはqueue_wait()を発行しているので、取得したキューの値はこの接続のみが扱えることになります(OWNERモード)。

キューの値は配列で返るので適当に処理します(上のサンプルだとprocess_row()のところ)。 処理に成功した場合はend()を呼ぶことでキューから値を削除します。 逆に失敗した場合はabort()を呼ぶと値はキューに戻され、他の接続からも参照可能になります。

取得したキューの値はend()が呼ばれるか次のdequeue()が呼ばれた時点で削除されます。 また、end()もabort()も呼ばれないまま切断された場合は、取得した値はキューに戻ります。

// キューへの接続 $queue->connect('mysql://user:pass@localhost:3306/database'); $queue->connect('mysqli://user:pass@localhost:3306/database'); $queue->connect('pdo_mysql://user:pass@localhost:3306/database');
接続にはPEAR::DBと同様の書式のDSNを指定します。
phptypeにはmysql/mysqli/PDO(mysql)の3種類が指定可能です。

// キューから値を取得 $queue->dequeue('my_queue', 5); $queue->dequeue('my_queue', 'my_queue2', 'my_queue3', 10);
dequeue()を発行してもキューに値がない場合、値がinsertされるまで一定時間待機します。 このタイムアウト時間はdequeue()の最後の引数で指定します。デフォルトは10秒間待機します。

また、Q4Mでは取得先のキューを優先度順に複数指定する事が可能です。 この場合はdequeue()の引数に取得先のキュー(テーブル名)を優先度の高い順に指定します。 キューを複数指定する場合、タイムアウト時間を省略することはできません。

// キューに取得条件を指定 $queue->dequeue('my_queue:id=1000'); $queue->dequeue('my_queue:score<30');
キューに取得条件を付加する場合は、テーブル名の後ろに「:」で条件式を繋いで記述します。 条件指定には様々な演算子が使用できるので詳しくはQ4Mのドキュメントを参照してください。

// キューに値を追加 $data = array( 'user_id' => 1000, 'message' => 'Hello!' ); $queue->enqueue('my_queue', $data);
キューに値を追加するときはenqueue()を使用します。
テーブルのカラムに対応したキーと値を保持する連想配列を引数に渡して実行します。

// キューの状態を取得する $result = $queue->status(); var_dump($result);
status()を呼ぶとキューの状態を保持する配列が返ります。 SHOW ENGINE QUEUE STATUS; の実行結果で得られる情報を連想配列化したもので、Queue::Q4M::Statusを見てなるほどなーと思って真似してしまいました。

ということで、リポジトリは誰でも編集可能なはずなので適当に弄ってあげてください。