PHP Stompライブラリを呼び出す消費者スクリプトを書く

消費側はこんな感じで。

<?php

/** キューの消費側サンプル */ // ライブラリ読み込み require_once 'Stomp.php'; // ローカルホストのStompサーバに接続 $connection = new StompConnection("localhost"); // TBA: エラー処理。ライブラリ中でdieしてるのでライブラリも要修正 // 接続パスワードは今は何でも通し $handler = $connection->connect("akky", "dummypassword"); // TBA: エラー処理 //print_r($handler); // キューの識別子を与えて、メッセージを受ける $connection->subscribe("/queue/miaumiau"); ``` // 無限ループで受信を続ける while (true) { // キューから一個取得 $gottenFrame = $connection->readFrame(); //print_r($gottenFrame); if (array_key_exists('message-id', $gottenFrame->headers)) { // 受け取り確認を発行 $connection->acknowledge($gottenFrame->headers["message-id"]); echo "Received [" . $gottenFrame->body . "]n"; } else { // 何かが変 echo "invalid framen"; break; } // サンプルはぐるぐる回してもいいけど、まあ適当な間隔で処理するイメージ sleep(1); } ```

// 接続を切る $connection->disconnect(); ?>

こっちを、別のシェル/コマンドプロンプトを開いて、

  • php Subscriber.php

と実行すると、キューにメッセージがあれば取り出して表示する。Subscriber.phpを起動したままでPubslisher.phpを起動すれば、キュー経由でメッセージが届いていることも確認できる。

実運用では、エラー処理をして、アクセスに認証をかけ、キューのIDを分けることでたくさんのキューを同時に扱い、localhostじゃなくて別サーバに分けて、みたいにいろいろとやることはあると思う。

CodehausのStompプロトコルのサイトでは、Codehausのものや他のものも含めて、いろいろな言語でのStompクライアントライブラリの情報が載っている。C/C++/C#&.NET/Delphi/Flash/Java/Perl/PHP/Pike/Python/Ruby/Smalltalkなど。

なので、Webアプリケーションの場合でも、ユーザからの入力によって発生したバックエンド側への指示をメッセージとしてActiveMQに投げることで、まったく別の言語のバックエンドと連携させることができそうだ。キューサーバーは別マシンにも置けるので、複数台に処理を分散させるときにも使える場合があるだろう。

僕は職業Javaプログラマじゃなくなってから何年も経っているので、ActiveMQという選択が今妥当なのか、ActiveMQの実運用性とかどこまで捌けるのか、とかはわかってない。Javaの詳しい人の突っ込みをお待ちしている。

ActiveMQは出力をRSSにしたりという機能もあるようで、

また、PHP勉強会での発表後に、興味あるのでうちでも遊んでみる、という声も聞いたので、負荷実験とか実サービスへの適用試行とかやってくれれば、僕もぜひ、どんなもんか聞きたいと思っている。

[参考]

Javaの理論と実践: 次期エンタープライズ・アプリケーションにJMSの採用を

メッセージキュー自身の解説と、使いどころの例示がある。

PHPからAmazon Web ServiceのSQSを使う

有料だけど自分でメッセージキューサーバの管理しなくて済む。