Topics
Enterprise Architecture
Tim Hanson
2007年6月20日(翻訳記事2007年10月25日)
PHPは広く普及しているスクリプト言語です。BEA WebLogic ServerはJava用に構築されたアプリケーションサーバです。PHPスクリプトからすべてのJavaリソースにアクセスできたらどんなにいいでしょう。その1つの方法として、PHP-Javaブリッジがあります。このブリッジでは、JavaとPHPはそれぞれのプロセスを出て、XMLでやり取りします。
別の方法として、 Quercusがあります。これは、同じプロセス内でJavaコードと共に実行するPHPの実装です。その結果、PHPスクリプトから、EJB、JMSキュー、データベース接続プール、POJOなどのすべてのJavaリソースにアクセスできます。
Quercusは、100% Pure JavaのPHP 5の実装です。PHPエンジンはJSPと同じように動作します。.phpファイルの要求をすべて受け取るPHPサーブレットがあります。このサーブレットによって、ページが解析、解釈されます。
Quercusは、ほとんどの標準PHPモジュールと、PDF、PDO、MySQL、JSONを含む多数の拡張をサポートしています。サポートされている拡張の全一覧は、 Que のwikiを参照してください。
Quercusでの実行が認定されているオープンソースのPHPアプリケーションも多数あります。これには、MediaWiki、Drupal、Gallery 2などがあります。認定されているアプリケーションとサポートされているバージョンの 全一覧も公開されています。
QuercusのWARファイルをダウンロードします。WARファイルを C:\quercusなどの一時ディレクトリに 展開します(以下、パスの例は、Windowsの場合です。Unixの場合は適切なパスに置き換えてください)。次に、展開したWebアプリケーション を、実行中のWeblogic Serverインスタンスにデプロイします。Quercusエンジンの制約により、warファイルとしてデプロイすることはできません。Quercusは Weblogic Studioからデプロイできます。Dev2DevのWorkshopのページから試用版をダウンロードできます。また、コンソールやコマンドラインからデプロイすることもできます。
コマンドラインからデプロイするには、まずコマンドライン環境を設定します。次に、weblogic deployerを起動します。
C:\MyDomain\bin> setDomainEnv C:\MyDomain> java weblogic.Deployer -user weblogic -password weblogic -url t3://localhost:7001/ -deploy -source c:\quercus
処理が正常に終了した場合、これでQuercusが実行されます。テストするには、Webブラウザで http://localhost:7001/quercus/を指定します。
ご覧のとおり、Pure Javaソリューションでの実行は非常に簡単です。Javaオブジェクトとの対話も非常に簡単です。コード例1に例を示します。
コード例1: javatest.php - PHP内へのJavaアクセスの埋め込み
<?php
$l = new Java("java.util.ArrayList");
$l->add($buf=new Java("java.lang.StringBuffer"));
$buf->append("100");
echo ($l->get(0)->toString()) + 2;
echo '<br />';
// get instance of Java class java.lang.System in PHP
$system = new Java('java.lang.System');
// demonstrate property access
echo 'Java version=' . $system->getProperty('java.version') . '<br />';
// java.util.Date example
$formatter = new Java('java.text.SimpleDateFormat',
"EEEE, MMMM dd, yyyy 'at' h:mm:ss a zzzz");
echo $formatter->format(new Java('java.util.Date'));
?>
この例を C:\quercus\javatest.phpとして保存します。次に、Webブラウザで http://localhost:7001/quercus/javatest.phpを指定します。
このコード例からわかるように、JavaコードをPHP内に埋め込むことができます。出力は次のようになります。
102 Java version=1.5.0_06 Thursday, June 04, 2007 at 12:33:56 PM Pacific Daylight Time
Javaクラスは、特殊なPHPクラスJavaを呼び出すことで作成します。この方法は、通常はjava.lang.Systemのようにインスタ ンス化しないJavaクラスにも使うことができます。Javaオブジェクトのフィールドやメソッドには、PHPのフィールドやメソッドと同じようにアクセ スします。詳細は、 ここを参照してください。
サンプルEJBとPHPクライアントプログラムを公開しています。 ダウンロードには、PHPスクリプト、Trader EJBを含むEAR、クライアントjarが含まれます(EARファイルにはすべてのJavaタイプのソースコードも含まれます)。サンプルを実行するには、次の手順に従います。
ejbref.phpを c:\quercusに置きます。TraderClient.jarを c:\quercus\WEB-INF\libに置きます。Trader.earファイルをターゲットのWebLogic Server にデプロイします。コード例2に ejbref.phpのソースコードを示します。このコードでは、フォームがロードされ、ユーザがリクエストを実行したときに、WebLogic ServerにあるEJBがインスタンス化されます。
コード例2: ejbref.php
<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() {
$home = jndi_lookup('TraderHome');
return $home->create();
}
?>
</body>
</html>
JNDIディレクトリとの対話には jndi_lookup()を使用し、また $trader->buy()と $trader->sell()でEJBを簡単に呼び出しています。
Quercusを使用すると、 MediaWikiのようなソフトウェアをデプロイ、実行することもできます。MediaWikiは、Wikipediaの背後にあるwiki実装です。MediaWikiをデプロイし、実行するには、次の手順に従います。
c:\に展開します。筆者はバージョン1.9.3を使用しました。ディレクトリ名を「wiki」に変更します。web.xmlと weblogic.xmlを作成します。copy c:\quercus\WEB-INF\lib\* c:\wiki\WEB-INF\lib\* を実行します。c:\quercus\WEB-INF\lib にコピーします。コード例3: web.xml
<web-app version="2.4">
<servlet>
<servlet-name>PHPServlet</servlet-name>
<servlet-class>com.caucho.quercus.servlet.QuercusServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PHPServlet</servlet-name>
<url-pattern>*.php</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.php</welcome-file>
</welcome-file-list>
</web-app>
コード例3に示すように、PHPファイルを処理するようにQuercusサーブレットを登録するだけでセットアップは完了です。
コード例4: weblogic.xml
<weblogic-web-app> <url-match-map>weblogic.servlet.utils.SimpleApacheURLMatchMap</url-match-map> </weblogic-web-app>
これで、wikiのセットアップページが表示されます。MySQLを設定、実行していれば、処理は正常に完了するはずです。
この記事では、100% Pure JavaのPHP 5の実装であるQuercusの概要、そしてWeblogic ServerでのQuercusの実行方法を示しました。Quercusを使って何ができるのか、サーバとどのように対話するのかご理解いただけたと思い ます。
Tim Hanson:BEA SystemsのJavelinコンパイラアーキテクト。1.5準拠の実装として初期のBEAのJavaコンパイラの大部分を開発。CORBA/IDLコンパイラ(IBM在籍時)、XQueryコンパイラなど、他にも数々のコンパイラを開発。