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はなんかプロトコルのトリックをつついてるみたいで、
ブラウザの仕様変わったら使えなさそうで嫌だし・・・。

PHPTALええのう

今更だが、Smartyは全然スマートじゃない。
なんでこんなのが流行ってるのだろうか。
流行ってるMTも管理画面重くて使い物にならないし。
日本人は右習えで飛びついて、批判的に吟味できないからほんと困る。

ていうか、世の中のテンプレートライブラリはデザイナを無視したものばかりで困る。
まあ、彼らをバカにするプログラマが作ってるからしょうがないんだけど。
まあ、動的サイトで最後に責任取るのはプログラマだからしょうがないんだけど。

というわけで、比較的デザイナを尊重したPHPTALを使ってみようと思う。

GameBlenderのバグ

むう、DynamicsをつけたObjectをActuatorでEndObjectさせると、
Blenderが強制終了する。

ソース見てないからまだわからないけど、
EndObjectの使い方を間違えてるのかなあ・・・。

GameBlender研究では超単純なゲームの作成チュートリアルを
やっていこうとしてるのだが、バグ一覧を作るのが先かもなあ・・・。