Weblogic Server内でのQuercus(Pure Java PHPエンジン)の実行

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について

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/を指定します。

Javaオブジェクト(POJO)の使用

ご覧のとおり、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の使用方法

サンプルEJBとPHPクライアントプログラムを公開しています。 ダウンロードには、PHPスクリプト、Trader EJBを含むEAR、クライアントjarが含まれます(EARファイルにはすべてのJavaタイプのソースコードも含まれます)。サンプルを実行するには、次の手順に従います。

  1. ejbref.phpc:\quercusに置きます。
  2. TraderClient.jarc:\quercus\WEB-INF\libに置きます。
  3. Trader.earファイルをターゲットのWebLogic Server にデプロイします。
  4. Webブラウザで http://localhost:7001/quercus/ejbref.phpを指定します。

コード例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を簡単に呼び出しています。

MediaWikiのデプロイ

Quercusを使用すると、 MediaWikiのようなソフトウェアをデプロイ、実行することもできます。MediaWikiは、Wikipediaの背後にあるwiki実装です。MediaWikiをデプロイし、実行するには、次の手順に従います。

  1. MySQLをインストールして起動します。
  2. MediaWikiを ダウンロードし、 c:\に展開します。筆者はバージョン1.9.3を使用しました。ディレクトリ名を「wiki」に変更します。
  3. WEB-INFというサブディレクトリを作成します。
  4. この後に示すテンプレートを使用して、エディタでWEB-INF内に web.xmlweblogic.xmlを作成します。
  5. WEB-INFにサブディレクトリlibを作成します。
  6. copy c:\quercus\WEB-INF\lib\* c:\wiki\WEB-INF\lib\* を実行します。
  7. MySQL JDBCドライバのjarを c:\quercus\WEB-INF\lib にコピーします。
  8. Webアプリケーションをデプロイします。
  9. ブラウザでhttp://localhost:7001/wiki/を指定します。

コード例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を設定、実行していれば、処理は正常に完了するはずです。

ダウンロード

  • php-samples.zip - この記事で使用したサンプルコードとユーティリティ

まとめ

この記事では、100% Pure JavaのPHP 5の実装であるQuercusの概要、そしてWeblogic ServerでのQuercusの実行方法を示しました。Quercusを使って何ができるのか、サーバとどのように対話するのかご理解いただけたと思い ます。

参考資料

  • Quercus - JavaオープンソースPHPエンジンのホームページ
  • MediaWiki - wikipediaが使用している、PHPで作成されたオープンソースwiki
  • MySQL - PHPアプリケーションで使用するオープンソースデータベース

Tim Hanson:BEA SystemsのJavelinコンパイラアーキテクト。1.5準拠の実装として初期のBEAのJavaコンパイラの大部分を開発。CORBA/IDLコンパイラ(IBM在籍時)、XQueryコンパイラなど、他にも数々のコンパイラを開発。