WebLogic ServerでのPHP-Javaブリッジの使用

Gary Horen著
2007年2月13日(翻訳記事2007年8月22日)

要約

PHPは広く普及しているスクリプト言語です。一方、BEA WebLogic ServerはJava用に構築されたアプリケーションサーバです。この両方の技術を並行して実行し、PHPとJavaの両方のメリットを享受するには、どうしたらいいでしょうか?1つの方法として、PHP-Javaブリッジがあります。このチュートリアルでは、PHPとJavaのアプリケーションコードを同時に使用できる2種類のブリッジの設定方法と使用方法を示します。

はじめに:PHP-Javaブリッジとは?

PHPエンジン(PHP言語のサポートを提供するコアインタプリタ)の実装で、WebLogic Serverで使用できるのは、ネイティブコードです。エンジンのインスタンスは専用のオペレーティング システム プロセス内で実行され、Webアプリケーションに関連する他のプロセスと何らかの方法で通信する必要があります。このとき、WebサーバやJavaアプリケーションサーバなどを使用できます。Javaサーバの場合、通信をアプリケーションプログラマに透過的にする技術があります。2つの環境間でデータを受け渡しし、アプリケーション開発者が2つの言語を統合するのに使用できるPHP言語の構造を提供するコンポーネントがあります。このコンポーネントが、PHP-Javaブリッジです。

なぜブリッジを使用するのか?

すべてを網羅する例として、「JavaとPHPを同じアプリケーションに融合すること」が挙げられます。これを行う方法をいくつか示します。

  • PHPコードで、POJOや、EJBなどのJava EEリソースのJavaオブジェクトをインスタンス化し、メソッドを呼び出すことができます。
  • PHPでコード化されたページのWebサーバとしてWebLogic Serverを使用できます。
  • 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 Platformブリッジ

Zendは、現在ユーザにほとんどのPHPサポートを提供するエンジンを提供しています。コアエンジンはオープンソースですが、Zendが提供するブリッジコンポーネントはZend Platformという市販製品の一部になっています。 ここでは、 Zend PlatformのJavaブリッジについて説明します。

このブリッジを使用するには、Apache FoundationのHTTPサーバ(WindowsではMicrosoftのIISも使用可)をインストールする必要があります。詳細なインストール手順は、Zend Platform製品に付属のZend Platformインストールガイドに記載されています。

ランタイム構成を図1に示します。ブリッジによってJVMがインスタンス化され、このJVMに、Javaオブジェクトのインスタンス化と操作のリクエストが渡されます。これには、JNDIを使用して配信されるものが含まれます。

図1
図1: ApacheのWebサーバを使用したJavaブリッジの実行

この構成では、次の処理が行われます。

  1. PHPリクエストが到着し、ApacheによってPHPエンジンに渡されます。
  2. PHPスクリプトで"new Java()"呼び出しが実行されると、ブリッジから、インスタンス化したJVMにリクエストが渡されます。このJVM内でPOJOリクエストを処理できます。
  3. この後は、JNDIリソースへのアクセスは通常の方法で行われます。

役立つヒント

  • ブリッジで使用される.jarファイルはすべて環境のクラスパスに存在する必要があります。このブリッジには、クラスパスの設定オプションがありません。

  • このブリッジでは、PHPのコアエンジンのようにデータが動的に変換されません。PHPコード内で型変換を行う必要があります。例えば、次のようなJavaメソッドを呼び出す場合、

    public void doSomething(int i);
    

    次のようなPHPコードを使用すると

    $var = "1"
    
    $javaObject->doSomething($var);
    

    Zendブリッジで、入力パラメータの型が間違っているという例外がスローされます。ブリッジでは暗黙で変換が行われないので、次のように、インタプリタでパラメータが渡される前に、文字列から数値への変換が行われるように強制できます。

    $javaObject->doSomething($var + 0);
    

SourceForgeブリッジ

これは、Zendのコアエンジンを使用する、無償、オープンソースのブリッジです。前述のZend Platformブリッジと同じように動作するように設定できます(Apache/PHP構成とJava EEサーバを接続)。このブリッジは、さらに、図2に示すようにJavaサーブレットとしてデプロイすることもできます。

SourceForgeのJavaブリッジをインストールするには、次の手順に従います。

  1. SourceForgeのサイトから任意のバージョンをダウンロードします。このチュートリアルでは、php-java-bridge_3.2.1_j2ee.zipを使用しています。
  2. zipファイルを開き、JavaBridge.warを展開します。
  3. JavaBridge.warを、Eclipseワークスペース内の新しいフォルダ(このチュートリアルでは「JavaBridge」)に展開します。
  4. SWorkshop Studioを使用する場合は、次の操作を行います。
    • バージョン3.2以降を使用する必要があります。ここからダウンロードできます。
    • Workshop Studioの新規プロジェクトウィザードを使用して、ワークスペースに、既存のソースから動的なWebプロジェクトを作成します。Webのコンテキストルートを/JavaBridgeに設定します。
    • warファイルを展開したフォルダを指定します(WTPに問題があるため、.warファイルを単にプロジェクトとしてインポートできません)。
  5. Studioまたは別の任意のツールでアプリケーションをWebLogic Serverにデプロイします。
  6. WebブラウザにURL「http://localhost:7001/JavaBridge」を入力します。index.phpに、ブリッジの処理を示すプログラム例がいくつか表示されます。

図2
図2: PHPサーブレットとしてのSourceForgeのJavaブリッジの実行

この構成では、次の処理が行われます。

  1. PHPリクエストが到着し、WebLogic ServerによってブリッジのPHPサーブレットにマップされます。
  2. PHPスクリプトがphp-cgiのインスタンスに渡され、処理されます。
  3. ブリッジから、Java Gatewayサーブレットへのリクエストとして、Javaオブジェクトへの呼び出しがWebLogic Server JVMに渡されます。
  4. この後は、JNDIリソースへのアクセスは通常の方法で行われます。

役立つヒント

  • サーブレット構成では、デフォルトで、PHPの呼び出しごとにこのブリッジによってCGIプロセスが生成され、リクエストの処理後に終了します。実行されるPHPリクエスト数が多い環境では、パフォーマンスの問題が発生する可能性があります。ブリッジのディストリビューションにはFastCGIを設定する手順が含まれます。FastCGIでは、PHPアドレス空間のプールが管理され、受け取ったリクエストが、空いているアドレス空間に割り当てられます。この方法で、リクエストごとのオペレーティング システム プロセスの開始と終了のオーバーヘッドを回避できます。この機能の設定の難度は、オペレーティング システム プラットフォームによって異なります。

サンプルコード:WebLogic Serverに存在するリソースへのアクセス

ブリッジ機能を使用するEJBとPHPクライアントプログラムのサンプルを提供しています。このコードはどちらのブリッジでも動作します。 ダウンロードには、PHPスクリプト、Trader EJBを含むEAR、およびクライアントjarが含まれます(EARファイルにはすべてのJavaタイプのソースコードも含まれます)。サンプルを実行するには、次の手順に従います。

  1. ejbref.phpをJavaBridge Webルートに追加します(SourceForgeブリッジの項で前述のEclipseプロジェクト、またはZendプラットフォームでtest.phpスクリプトを含むディレクトリ)。
  2. TraderClient.jarをブリッジから使用可能にします。Zendブリッジの場合は環境のクラスパスに追加し、SourceForgeブリッジの場合はデプロイしたサーブレットアプリケーション内のWEB-INF/libに追加します。
  3. Trader.earファイルをターゲットのWebLogic Serverにデプロイします。
  4. ブラウザで、デプロイしたejbref.phpスクリプトを指定し、実行します。

次のコード例に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と言語のプログラムマネージャです。