目次


Java ベースの PHP フレームワーク、Quercus の紹介

はじめに

Quercus はオープンソースの PHP 5 エンジンであり、すべてが Pure Java で実装されています。Quercus のドキュメントによれば、Quercus は Resin アプリケーション・サーバー上で動作し、ロード・バランシングやプロキシー・キャッシングといった Resin の機能を活用します。この記事では Quercus を Apache Tomcat 上で実行することで、Quercus に用意された機能について説明します。また、PHP と Java とを合わせて使用して Web サービスや Web アプリケーションを作成するという、Quercus の手法の容易さと柔軟性についても説明します。

なぜ Quercus なのか

Quercus PHP ライブラリーは完全に Java で実装されており、Java アプリケーションであると同時に PHP アプリケーションでもあるというメリットを実現しています。Java と PHP が緊密に統合されているため、Quercus アプリケーションは Spring や Hibernate、SOA フレームワークなどの Java の技術やフレームワークを利用することができます。この相互運用性を実現するために、Quercus には PHP から Java ライブラリーを呼び出すための API が用意されています。

それ以外にも、Quercus には以下のメリットがあります。

  • 開発が容易: PHP ライブラリーが Java で実装されているため、高速で信頼性が高く、しかも簡単に使うことができます。開発者は C ベースの PHP 実装に見られるセグメンテーション違反や C ポインターのオーバーランなどを心配する必要がありません。
  • スケーラビリティー: Quercus は Java ベースの実装であるため、Resin や Apache Tomcat などのアプリケーション・サーバー上で実行されます。そのため、アプリケーション・サーバーのすべての機能を利用することができます (コネクション・プーリングや分散セッションなど)。
  • 国際化: Quercus は PHP の Java 実装であるため、本質的に 16 ビットの Unicode ストリングと関数をサポートしています。

Quercus をインストールする

Quercus のインストールは、jar ファイルを Java アプリケーションにインストールするだけの簡単なものですが、Quercus は Resin アプリケーション・サーバーの機能の一部であるため、Resin の中に組み込まれています。また、Quercus が PHP エンジンとしての機能も備えているため、PHP エンジンをダウンロードする必要もありません。Quercus をインストールするためには以下のステップに従います。

  • Resin アプリケーション・サーバーを Caucho Technology の Web サイトからダウンロードします (「参考文献」を参照)。
  • zip ファイルを開き、jar ファイル (quercus.jar、resin-util.jar、javamail-141.jar) を解凍します。
  • これらのファイルと、(必要であれば) MySQL コネクターの jar ファイルを Web アプリケーションの WebContent\WEB-INF\lib フォルダーにコピーします。
  • 以上のステップを簡単に行うもう 1 つの方法として、この記事の最後にある zip されたサンプル・アプリケーションをベースとして使用し、そこからライブラリーをコピーする方法があります (「ダウンロード」を参照)。

Quercus の登場

Quercus の機能を説明するために、ここでは単純な HelloWorld の例を説明します。このアプリケーションを以下のステップで作成します。(私はこの記事で紹介するすべてのアプリケーションを Eclipse IDE で作成し、ステップの概要がわかるようにスクリーンショットを貼り付けました。これらのアプリケーションは、どのような IDE を使用した場合も同じように動作するはずです。)

以下に説明するステップの基本的な考え方としては、動的な Web アプリケーションのプロジェクトを作成し、このプロジェクトでアプリケーション・サーバーのランタイム (この場合は Apache Tomcat) を指定したり、php.ini や web.xml などのパラメーターを構成したりします。

  • IDE (この場合は Eclipse) の中で、図 1 のように新しい Web プロジェクトを作成します (Alt + Shift + N)。
図 1. 新しいプロジェクトを作成する
新しいプロジェクトを作成する
新しいプロジェクトを作成する
  • プロジェクトの名前とターゲットのランタイムを入力します。セットアップ画面の例を図 2 に示します。
    • 図 1 で示したように、「File (ファイル)」 --> 「New (新規)」の順にクリックし (Alt + Shift + N)、「Dynamic Web Project (動的 Web プロジェクト)」を選択することで表示されたセットアップ画面では、「TestHelloWorld」という新しい動的な Web プロジェクトをデフォルトのワークスペースに作成します。
    • ここでは、このアプリケーションのランタイム環境として Apache Tomcat Version 5.5 を使うように構成しました。
図 2. 新しいプロジェクトをセットアップする
新しいプロジェクトをセットアップする
新しいプロジェクトをセットアップする
  • 作成される構造を図 3 に示します (この構造には Quercus とそれに関連する jar が含まれています)。WebContent、META-INF (マニフェスト・ファイルまたはコンテキスト・ファイルを含みます)、JavaScript Resources などのフォルダーが作成されます。
図 3. ディレクトリー構造をセットアップする
ディレクトリー構造をセットアップする
ディレクトリー構造をセットアップする

このプロジェクトのルート・ディレクトリー (TestHelloWorld) には、以下のようなディレクトリーが含まれています。

  • WebContent: このディレクトリーには WEB-INF ディレクトリーがあり、その配下の lib ディレクトリーには quercus.jar などのライブラリーが含まれています。また WebContent ディレクトリーには META-INF ディレクトリーもあり、その配下に Manifest.mf ファイルが含まれています。WEB-INF ディレクトリーには、Web アプリケーションの静的コンテンツと動的コンテンツも含まれています (php ファイル、jsp ファイル、html ファイルなど)。
  • Java Resources: このディレクトリーには、Apache Tomcat や JRE、Web アプリケーションなどのライブラリーが含まれています。
  • JavaScript resources: このディレクトリーには、このプロジェクトに含める必要のある、あらゆるリソースが含まれます。

IDE を使ってサーバーを作成して構成し、通常モードまたはデバッグ・モードで実行します (図 4)。

Eclipse の「J2EE」パースペクティブには「Server (サーバー)」タブがあります。このタブの中で、サーバーを右クリックして表示されるメニューから、新しいサーバーを作成することができます (図 4)。こうして作成するサーバーは、Eclipse IDE からアプリケーション・サーバーを管理するために使用することができます。

図 4. 新しいサーバーを作成する
新しいサーバーを作成する
新しいサーバーを作成する

この新しいサーバーの定義では、特別な場合以外は単純にデフォルトを選択します (図 5)。このサーバー・ランタイムは、このプロジェクトを作成する際に選択したサーバー・ランタイムと同じであり、この場合は Apache Tomcat Version 5.5 です。

図 5. 新しいサーバーを構成するために選択した内容
新しいサーバーを構成するために選択した内容
新しいサーバーを構成するために選択した内容
  • サーバーのタイプを指定したら、次に表示される図 6 の画面でリソースを追加することができます (左側の「available (使用可能)」列から右側の「configured (構成済み)」列に追加します)。

新しいサーバーの構成では、新たに作成されたリソースをサーバー上で構成する必要があります (図 6)。この、サーバー上での構成によって、開発中に作成されたリソースがデプロイされます。

図 6. サーバー上でリソースを構成する
サーバー上でリソースを構成する
サーバー上でリソースを構成する

Quercus を構成する

php.ini ファイルを使って PHP の動作を構成します (ディレクトリーやファイル・パスの設定、セッションの変更など)。この php.ini ファイルは、web.xml ファイルの中で指定します。その一例をリスト 1 に示します。

リスト 1. web.xml ファイルで php.ini を指定する
	<init-param>
	      <param-name>ini-file</param-name>
      	<param-value>WEB-INF/php.ini</param-value>
	    </init-param>

script-encoding パラメーターに、PHP ソース・ファイルのエンコーディングを指定します。その一例をリスト 2 に示します。

リスト 2. web.xml ファイルで PHP のエンコーディングを指定する
	<init-param>
	      <param-name>script-encoding</param-name>
      	<param-value>UTF-8</param-value>
	    </init-param>

QuercusServlet は Quercus エンジンに対するインターフェースであり、PHP ファイルを解析します。通常はリスト 3 のように構成します。

リスト 3. web.xml ファイルで QuercusServlet を構成する
	<web-app xmlns=”http://java.sun.com/xml/ns/j2ee” 
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” 
	xsi:schemaLocation=”http://java.sun.com/xml/ns/j2ee 
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd” 
	version=”2.4”> 
	<description>Quercus Hello World on Tomcat</description>
	<servlet>
    		<servlet-name>Quercus Servlet</servlet-name>
		<servlet-class>com.caucho.quercus.servlet.QuercusServlet</servlet-class>

Quercus による HelloWorld アプリケーションの php ファイル (index.php) を作成する

index.php ファイルでは getTheDate というメソッドを定義し、このメソッドによって Java オブジェクトをインスタンス化します。Quercus の場合、import 文を使えば任意の Java クラスを利用することができるため、Quercus は非常に相互運用性が高く、また柔軟です。その一例をリスト 4 に示します。

リスト 4. PHP のインポート機能
	<?php
		function getTheDate() {
		import java.util.Date;
		$currentDate = new Date();
		return $currentDate;
		}
	?>

リスト 5 のコードは HTML フラグメントの中で getTheDate() メソッドと phpinfo() メソッドを呼び出す方法を示しています。

リスト 5. getTheDate() と phpinfo() を呼び出す
	<body>
	<h1>This is the Hello World page</h1>
	<h3>but, it does something more then Hello World!</h3>
	<h4> The current date and time is :<?php echo getTheDate() ?></h4>
	<h4> and finally here is the phpInfo: <?php echo phpinfo()?>
	</body>

コードを変更したら、HelloWorld アプリケーションをテストできるようにサーバーを起動する必要があります。そのためには、先ほど作成したサーバーの構成を右クリックし、「Start (開始)」または「Debug (デバッグ)」をクリックします (図 7)。

図 7. デバッグ・モードまたは通常の実行モードでサーバーを起動する
デバッグ・モードまたは通常の実行モードでサーバーを起動する
デバッグ・モードまたは通常の実行モードでサーバーを起動する

図 8 はサーバーを起動して HelloWorld の URL にアクセスした場合のアプリケーションの最終的な出力を示しています。

この記事の最後にあるサンプル・ファイル (HelloWorld.zip) には、このアプリケーションの zip 版が含まれています (「ダウンロード」を参照)。またサンプル・ファイルには Eclipse に必要なメタデータ・ファイルも含まれているため、Eclipse に直接シームレスにインポートすることができます。

図 8. Hello World ページの出力
Hello World ページの出力
Hello World ページの出力

Quercus の実際

では、実際の例を調べてみましょう。図 9 は Manage Customer (顧客管理) ページの例です。ユーザーはこのページから、新しい顧客をデータベースに追加したり、データベースの中の顧客を検索したり、またデータベースの中のすべての顧客を表示したりすることができます。

図 9. Manage Customer アプリケーションのフロー
Manage Customer アプリケーションのフロー
Manage Customer アプリケーションのフロー

上の図からわかるように、HTTP リクエストを受信するのは Tomcat です。web.xml に記述された構成では、QuercusServlet オブジェクトは PHP ファイルを解析するように定義されています。このオブジェクトは Quercus ライブラリーとやりとりする Java サーブレットです。このサンプル・アプリケーションでは、PHP ファイルの中でインスタンス化される PDO (PHP Data Object) オブジェクトが MySQL コネクターを使って MySQL データベースとの接続をインスタンス化します。PDO を使うことで、Prepared Statement などの高度な機能を含む統一的な方法でデータベースにアクセスすることができます。

Manage Customer アプリケーションのディレクトリー構造 (図 10) は、上記の HelloWorld の例で説明したディレクトリー構造と同じパターンに従っています。

図 10. Manage Customer アプリケーションのディレクトリー構造
Manage Customer アプリケーションのディレクトリー構造

このアプリケーションの中心的なファイル群は WebContent ディレクトリーの配下にある以下のサブディレクトリーに含まれていることに注意してください。

  • META-INF: このサブディレクトリーには、MySQL データベースに接続するためのクレデンシャル情報が含まれています。
  • WEB-INF: このサブディレクトリーには、アプリケーションを実行するための quercus.jar などのファイルが含まれたライブラリーのディレクトリーがあります。WEB-INF にはデータソースに関して記述した web.xml も含まれています。
  • 関連するすべての php ファイルと html ファイルは WebContent フォルダーに含まれています。これらのファイルはアプリケーションの表示部分として使われ、Web アプリケーションの動的コンテンツと静的コンテンツを提供します。

この記事の最後にあるサンプル・ファイル (ManageCustomer.zip) には、このアプリケーションのファイル群を zip したものが含まれていることに注意してください (「ダウンロード」を参照)。またサンプル・ファイルには Eclipse に必要なメタデータ・ファイルも含まれているため、Eclipse に直接シームレスにインポートすることができます。

Tomcat と MySQL を構成する

Tomcat を構成する方法は HelloWorld アプリケーションを構成する場合と非常によく似ていますが、この場合はさらにリソース参照を定義する必要があります (リスト 6)。このリソース参照を定義する要素では、リソース・マネージャーの接続ファクトリーの参照名を定義します。この場合、その名前は jdbc/mysql によって指定されるデータベース接続であり、その型は javax.sql.DataSource です。

リスト 6. web.xml でリソース参照を定義する
	web.xml
	. . .
	<resource-ref>
	      <description>DB Connection</description>
	      <res-ref-name>jdbc/mysql</res-ref-name>
	      <res-type>javax.sql.DataSource</res-type>
	      <res-auth>Container</res-auth>
	</resource-ref>
	. . .

WebContent/META-INF ディレクトリー配下の context.xml では、接続リソースを定義する必要があります (リスト 7)。このリソースには、ドライバーの名前、JNDI の名前、ユーザー名、パスワード、データ型、URL などのプロパティーが含まれます。

リスト 7. context.xml でプロパティーを定義する
	context.xml
	. . .
	<Context>
	<Resource driverClassName="com.mysql.jdbc.Driver" 
	maxActive="4" maxIdle="2" maxWait="5000" auth="Container" 
	name="jdbc/mysql" password="" type="javax.sql.DataSource" 
	url="jdbc:mysql://localhost:3306/customer" username="root"/>
	</Context>
	. . .

顧客データベースには 1 つのテーブルがあり、このテーブルは以下のスクリプトを実行することで作成することができます。

	use customer;
	CREATE TABLE users (
		id INT NOT NULL PRIMARY_KEY AUTO_INCREMENT, 
		name VARCHAR(200)
	);

このアプリケーションにも、HelloWorld アプリケーションを作成する際に説明した構成ステップ (新しいサーバーの作成および構成、リソースの追加、デバッグ・モードまたは通常の実行モードでのサーバーの起動など) を同じように適用できることに注意してください。

アプリケーションの要約

このアプリケーションの index ページには、ユーザーが実行できる操作の一覧が表示されます (図 11)。

図 11. Manage Customer の index ページのスクリーンショット
Manage Customer の index ページのスクリーンショット

サポートされている操作は以下のとおりです。

  • Add Customer (顧客の追加)
  • Search Customer (顧客の検索)
  • View all Customers (すべての顧客の表示)
  • Delete all Customers (すべての顧客の削除)

すべての操作を表示する index.html ページは、独自のアクションを持つ個々のフォームで構成されています。「Add Customer (顧客の追加)」を詳細に見てみましょう。「Add Customer (顧客の追加)」に対応する html には、フォームのアクションとしての addCustomer.php への参照と POST メソッドが含まれています。

	<H2>Add Customer</H2>
	<form action="addCustomer.php" method="post">
	<label>Customer name</label>
	<input type="text" id="customerName" name="customerName"/>
	<input type="submit" value="Add"/>
	</form>

このアクションの中にある PHP コードによって POST から customerName パラメーターが抽出され、データベースに挿入するための SQL 文が作成されます。次にデータソースの JNDI 名を渡すと PHP データ・オブジェクトがインスタンス化されます。

	<?php
	$custName = $_POST['customerName'];
	$pdo = new PDO("java:comp/env/jdbc/mysql");
	$sql = "insert into users values ('" . $custName . "');";
  	$rows = $pdo->exec($sql);
  	if ($rows>0) {

	echo("<h4> Adding ". $custName . " was successful</h4>");
	}
	else echo('<h4> An error occurred</h4>');
	?>

「Search Customer (顧客の検索)」、「View all Customers (すべての顧客の表示)」、「Delete all Customers (すべての顧客の削除)」操作も同様の方法で実装されています (「ダウンロード」セクションのソース・コードを参照)。

図 12. 「View all Customers (すべての顧客の表示)」ページのスクリーンショット
「View all Customers (すべての顧客の表示)」ページのスクリーンショット

まとめ

この記事では Quercus の機能の説明として、Quercus を Apache Tomcat 上で実行する方法と MySQL データベースに接続する方法を説明しました。Quercus は完全に Java で実装された PHP フレームワークであるため、Spring や Hibernate など、Java ベースのフレームワークをフルに活用することができます。また、Quercus はコア・フレームワークが Java で実装されているため非常に堅牢でスケーラブルであり、その一方で PHP の一面を持っているため、開発者にとっても非常に使いやすいフレームワークになっています。


ダウンロード可能なリソース


関連トピック

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Web development, Open source
ArticleID=438186
ArticleTitle=Java ベースの PHP フレームワーク、Quercus の紹介
publish-date=09222009