Topics
Enterprise Architecture
Gary Horen著
2007年2月13日(翻訳記事2007年8月22日)
PHPは広く普及しているスクリプト言語です。一方、BEA WebLogic ServerはJava用に構築されたアプリケーションサーバです。この両方の技術を並行して実行し、PHPとJavaの両方のメリットを享受するには、どうしたらいいでしょうか?1つの方法として、PHP-Javaブリッジがあります。このチュートリアルでは、PHPとJavaのアプリケーションコードを同時に使用できる2種類のブリッジの設定方法と使用方法を示します。
PHPエンジン(PHP言語のサポートを提供するコアインタプリタ)の実装で、WebLogic Serverで使用できるのは、ネイティブコードです。エンジンのインスタンスは専用のオペレーティング システム プロセス内で実行され、Webアプリケーションに関連する他のプロセスと何らかの方法で通信する必要があります。このとき、WebサーバやJavaアプリケーションサーバなどを使用できます。Javaサーバの場合、通信をアプリケーションプログラマに透過的にする技術があります。2つの環境間でデータを受け渡しし、アプリケーション開発者が2つの言語を統合するのに使用できるPHP言語の構造を提供するコンポーネントがあります。このコンポーネントが、PHP-Javaブリッジです。
すべてを網羅する例として、「JavaとPHPを同じアプリケーションに融合すること」が挙げられます。これを行う方法をいくつか示します。
最初の2つのケースについてこの後で説明します。3つめのケースについてはこの記事では説明しません。
現時点では2つのブリッジがあり、その両方をWebLogic Serverで使用できます。1つは Zend Technologies Ltd.の市販製品です。もう1つはオープンソースコンポーネントで、LGPLでライセンスされ、 SourceForgeに格納されています( php.netに別の実装が存在しますが、これは古く、最新バージョンのPHPをサポートしていないので、このチュートリアルでは取り上げません)。
どちらのブリッジでも、PHPと、POJO(Plain Old Java Object)や、WebLogic ServerにあるJava EEリソースの両方との対話が可能です。WebLogic Serverのリソースは、JNDIを使用してアクセスします。次のコード例は、WebLogic Serverにある、EJB、データベース接続、JMSキューなどのリソースを取得するPHPコードを示しています。このコードは、どちらのブリッジでも使用できます。
// Get a reference to a container-managed resource from WebLogic Server
function getWebLogicResource($jndiName) {
// Set WebLogic-specific parameters for creation of jndi naming context:
// (weblogic.jar must be on the PHP-Java Bridge classpath)
$envt = array(
"java.naming.factory.initial" => "weblogic.jndi.WLInitialContextFactory",
"java.naming.provider.url" => "t3://localhost:7001" // replace with your target server URL
);
// The bridge creates the naming context object in the local JVM.
$ctx = new Java('javax.naming.InitialContext', $envt);
// Now JNDI crosses the network, to obtain the resource.
return $ctx->lookup($jndiName);
}
実際の実装を使用してこのチュートリアルを実行する場合、両方のブリッジを同じマシンで同時にテストしないでください。Zendの製品では、実行の検索パスにファイルを置いてサービスが開始されます。これが、SourceForgeのブリッジの動作を妨げます。
不明な点がある場合は、Dev2DevのPHPニュースグループにご質問・ご意見を投稿してください。このチュートリアルのテストはWindows XPで実施されました。どちらのブリッジもさまざまなWindowsとUnixのプラットフォームで動作します。想定している構成がサポートされるかどうかについては、対応するブリッジのマニュアルを参照してください。
Zendは、現在ユーザにほとんどのPHPサポートを提供するエンジンを提供しています。コアエンジンはオープンソースですが、Zendが提供するブリッジコンポーネントはZend Platformという市販製品の一部になっています。 ここでは、 Zend PlatformのJavaブリッジについて説明します。
このブリッジを使用するには、Apache FoundationのHTTPサーバ(WindowsではMicrosoftのIISも使用可)をインストールする必要があります。詳細なインストール手順は、Zend Platform製品に付属のZend Platformインストールガイドに記載されています。
ランタイム構成を図1に示します。ブリッジによってJVMがインスタンス化され、このJVMに、Javaオブジェクトのインスタンス化と操作のリクエストが渡されます。これには、JNDIを使用して配信されるものが含まれます。
図1: ApacheのWebサーバを使用したJavaブリッジの実行
この構成では、次の処理が行われます。
役立つヒント
ブリッジで使用される.jarファイルはすべて環境のクラスパスに存在する必要があります。このブリッジには、クラスパスの設定オプションがありません。
このブリッジでは、PHPのコアエンジンのようにデータが動的に変換されません。PHPコード内で型変換を行う必要があります。例えば、次のようなJavaメソッドを呼び出す場合、
public void doSomething(int i);
次のようなPHPコードを使用すると
$var = "1" $javaObject->doSomething($var);
Zendブリッジで、入力パラメータの型が間違っているという例外がスローされます。ブリッジでは暗黙で変換が行われないので、次のように、インタプリタでパラメータが渡される前に、文字列から数値への変換が行われるように強制できます。
$javaObject->doSomething($var + 0);
これは、Zendのコアエンジンを使用する、無償、オープンソースのブリッジです。前述のZend Platformブリッジと同じように動作するように設定できます(Apache/PHP構成とJava EEサーバを接続)。このブリッジは、さらに、図2に示すようにJavaサーブレットとしてデプロイすることもできます。
SourceForgeのJavaブリッジをインストールするには、次の手順に従います。
図2: PHPサーブレットとしてのSourceForgeのJavaブリッジの実行
この構成では、次の処理が行われます。
役立つヒント
サーブレット構成では、デフォルトで、PHPの呼び出しごとにこのブリッジによってCGIプロセスが生成され、リクエストの処理後に終了します。実行されるPHPリクエスト数が多い環境では、パフォーマンスの問題が発生する可能性があります。ブリッジのディストリビューションにはFastCGIを設定する手順が含まれます。FastCGIでは、PHPアドレス空間のプールが管理され、受け取ったリクエストが、空いているアドレス空間に割り当てられます。この方法で、リクエストごとのオペレーティング システム プロセスの開始と終了のオーバーヘッドを回避できます。この機能の設定の難度は、オペレーティング システム プラットフォームによって異なります。
ブリッジ機能を使用するEJBとPHPクライアントプログラムのサンプルを提供しています。このコードはどちらのブリッジでも動作します。 ダウンロードには、PHPスクリプト、Trader EJBを含むEAR、およびクライアントjarが含まれます(EARファイルにはすべてのJavaタイプのソースコードも含まれます)。サンプルを実行するには、次の手順に従います。
次のコード例にejbref.phpのソースコードを示します。このコードでは、フォームがロードされ、ユーザがリクエストを実行したときに、この記事の最初のコード例と同じ方法でWebLogic ServerにあるEJBがインスタンス化されます。
<html><head><title>Buy or Sell shares</title></head>
<body>
<?php
if (isSet($_POST['ticker'])) {
$trader = getBean();
if (isSet($_POST['buy'])) {
$result = $trader->buy($_POST['ticker'], ($_POST['shares'] + 0) );
$action = 'bought';
}
else {
$result = $trader->sell($_POST['ticker'], $_POST['shares'] + 0);
$action = 'sold';
}
$trader->remove();
print <<<__HTML__
<i>{$result->getNumberTraded()} shares of {$result->getStockSymbol()} $action.</i>
__HTML__;
}
else {
print <<<__HTML__
<form action="http://localhost:7001/JavaBridge/ejbref.php" method="post">
Ticker Symbol: <input type="text" size="4" name="ticker"/><p>
Number of Shares: <input type="text" size="6" name="shares"/><p>
<input type="submit" name="buy" value="buy"/> <input type="submit" name="sell" value="sell"/>
__HTML__;
}
function getBean() {
$envt = array(
"java.naming.factory.initial" => "weblogic.jndi.WLInitialContextFactory",
"java.naming.provider.url" => "t3://localhost:7001"
);
$ctx = new Java('javax.naming.InitialContext', $envt);
$home = $ctx->lookup('TraderHome');
return $home->create();
}
?>
</body>
</html>
ツールオプションには、 市販製品であるZend StudioとEclipse PHP Development Tools(PDT)の2つがあります。Eclipse PDTの安定バージョンはZend Eclipseの更新サイト http://www.zend.com/pdtからダウンロードできます。その後のバージョンは Eclipse PDTプロジェクトから直接ダウンロードできます。PDTはWorkshop Studioリリース3.2 以降にインストールできます(Workshop for WebLogicにはまだインストールできません)。PDTにはPHPの編集用ツール(コードの色分け、自動補完、構文エラー検出)があります。SourceForgeのPHPサーブレット構成をWebLogic Serverにデプロイするには、Workshop Studioが役立ちます。
Zend Platformブリッジには、Zend Studioデバッガ(市販製品)を使用できます。SourceForgeブリッジに付属するPHPのコアエンジンにはサーバサイドデバッガがないようなので、そのままではZend Studioを使用できません。現時点ではEclipseデバッガは開発中です。この記事の執筆時点では、どちらのブリッジにも使用できませんでした。
php-java-bridge.zip - この記事で説明したPHPスクリプト、EAR、JARファイルが含まれます
このチュートリアルでは、PHP-Javaブリッジを設定する方法を示しました。このような構成の作成と管理が複雑であることも、ご理解いただけたと思います。作成するアプリケーションでこの2つの言語を融合したい開発者のために、JVMに共存するPHPとJavaの統合には今後も取り組んでいきます。今後の計画については、筆者のブログをご覧ください。
Gary Horenは、BEA WorkshopチームのAjaxと言語のプログラムマネージャです。