カテゴリー
技術

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

消費側はこんな感じで。 <?php /** キューの消費側サンプル */ // ライブラリ読み込み require_once ‘Stomp.php’; // ローカルホストのStompサーバに接続 $connect […]

消費側はこんな感じで。


<?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を使う

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