Home > プログラミング > PHP

PHP Archive

GAEとPHPでComet

レン鯖でCometすると停止されるので、GAEでできないかなーと探したら
できるようになってた(スティルハウスの書庫さんのところより)。

てなわけで、PHPのJava実装のQuercusからChannel APIを叩いたら動いた。

PHPなHTML5時代はGAEでキマリだね☆ミ

※詳細は後日→会社のブログに書いておきました

BlazeDSをPHPから呼び出す。(3)

quercusでblazedsのdestinationを参照できない件は、
単にservlet contextの問題っぽいな。

結局のところ、quercusの初期化時にblazedsがインポートされていないために
blazeds関係の初期化が行われていないのではないかと。

想定される解決方法は以下2つ。
1、blazedsを初期化してロードし直す。
2、quercusをblazedsをインポートするよう改変してコンパイルする。

1も2もやり方がわからないが、どちらかで解決できるのではないかと思う。

BlazeDSをPHPから呼び出す。(2)

いくつか訂正。

・Javaクラスは継承できるっぽい。単にweb.xmlの情報が引き継がれてないだけ。
・ていうか、MessageBrokerのラッパをロードしてたら以下だけで行けた。

<?php

$mb = new BLZ_MessageBroker();
$mb->routeMessageToService(‘chat’, “Hello from PHP.”);

?>

超単純じゃね? あとはRPCできるかどうかだな。
できるならばラッパクラスライブラリを作ってしまおう。

ただ、意味のある分担開発ができるか、デバッグがやりやすいかが問題。
単に目的と手段の逆転でしかなければJavaだけでやった方がよさげ。

そして気になるのがライセンス。QuercusはGPLなのだけど、
GPLなスクリプトエンジン上で動かすアプリって感染してしまうのだろうか・・・。

BlazeDSをPHPから呼び出す。

微妙に成功した。

<用意するもの>
Quercus(JavaによるPHP実装)
BlazeDS

<Quercusのインストール>
以下を参照のこと。
Blog de fabien

<具体的な呼び出し方>
BlazeDSのAPIはPHPから直接呼べたものの、web.xmlの情報などを継承できていない(?)のか、
メッセージを飛ばすときに「指定されたDestinationは存在しない」とか言われた。
しょうがないのでJavaのラッパーを呼ぶ形にしている。
JRubyならできているらしいのだが・・・。

<検証ソース>※BlazeDSのサンプル「testdrive-chat」用。

■BlazeDSのAPIを呼ぶJavaのソース
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import flex.messaging.MessageBroker;
import flex.messaging.util.UUIDUtils;
import flex.messaging.messages.AsyncMessage;

public class BLZ_MessageBroker {
public void routeMessageToService(String dest, Object message) {
MessageBroker msgBroker = MessageBroker.getMessageBroker(null);
String clientID = UUIDUtils.createUUID();
AsyncMessage msg = new AsyncMessage();
msg.setDestination(dest);
msg.setClientId(clientID);
msg.setMessageId(UUIDUtils.createUUID());
msg.setTimestamp(System.currentTimeMillis());

msg.setBody(message);
msgBroker.routeMessageToService(msg, null);
}
}

■ラッパーAPIを呼び出すPHPのコード
<?php
import flex.messaging.MessageBroker;
import flex.messaging.util.UUIDUtils;
import flex.messaging.messages.AsyncMessage;

$response->setContentType(“text/html; charset=UTF-8”);

$message = “Hello from PHP.\n”;
$blz = new BLZ_MessageBroker();
$blz->routeMessageToService(“chat”, $message);
?>

それぞれを配置したらtestdrive-chatのページを開いておき、
別のブラウザで配置したPHPにアクセスすると「Hello from PHP.」と表示される。

<Quercusの現状の問題点>
・なぜかweb.xmlの情報などを継承できていない(?)
・Javaのメソッドをオーバーライドできない(?)ので、結局Javaコードを書く羽目になる。
・PHP5相当だが、ライブラリなどの実装が不完全。(PDOなど一通りある模様)
※実装状況はこのページを参照のこと。

<まとめ>
あまりスマートではないものの、
これでPHPを使ってサーバープッシュ型のコンテンツが作れるならば挑戦してみる価値はあると思う。

ていうか、そもそもの目的は1分単位の精度で
メールが届いたことを知らせたいだけだったんだけど、大げさだな。
素直にIFRAMEリロードかAJAXでやろうかなあ。
COMETはなんかプロトコルのトリックをつついてるみたいで、
ブラウザの仕様変わったら使えなさそうで嫌だし・・・。

Home > プログラミング > PHP

Search
Feeds
Meta

Return to page top