Servlet/JSPコンテナとしての動作は確認できたので、次にResinのQuercusの動作確認をしてみました。次のようなinfo.phpファイルをwebapps/ROOTにおいて、「http://localhost:8080/info.php」へアクセスするだけです。この結果から、PHP 5.0.4であることやシステムのカーネルが何かなどが分かります。後は、同様にしてPHPのプログラムを追加していけば、PHPプログラミングができます。標準APIは基本的にサポートしているので、基本的なプログラミングで困ることはなさそうです。
<?php phpinfo() ?>
さて、特に設定をしなくてもPHPが使えてしまいました。実は、PHPが動作するように初期設定がされています。設定ファイルは、resin-3.1.0/conf/app-default.xml にあります。これを見れば分かるように、PHPを実行しているServletクラスはcom.caucho.quercus.servlet.QuercusServletです。
ちなみに、resin-3.1.0/webapps/の下へsample、sample/WEB-INFというディレクトリを作成して、sample/info.phpなどを置けば、「http://localhost:8080/sample/info.php」を動作させることもできます。このようにして、PHPのWebアプリケーションをすぐに開発し始めることができるわけです。
<web-app> (略) <servlet servlet-name="resin-php" servlet-class="com.caucho.quercus.servlet.QuercusServlet"> </servlet> (略) <servlet-mapping url-pattern="*.php" servlet-name="resin-php"/> (略) <welcome-file-list> <welcome-file>index.jsp</welcome-file> <welcome-file>index.php</welcome-file> <welcome-file>index.html</welcome-file> </welcome-file-list> (略) </web-app>
次に、日本語を含むhello.phpをUTF-8で保存して使ってみました。最近はUTF-8を使えば何とかなる場合が増えてきているので、そのまま日本語が使えることを期待したのですが、見事期待どおりにきちんと使えました。
<?php header('Content-Type: text/html;charset=UTF-8'); ?> <html> <head><title>タイトルテスト</title></head> <body> <?php echo "日本語テスト" ?> </body> </html>
ファイルからのデータ読み込みもしてみました。filetest.phpというPHPプログラムで、次のようにUTF-8で保存したテキストファイルであるhello.txtを開いて表示するだけの単純なものです。このプログラムは残念なことに、「http://localhost:8080/filetest.php」とアクセスすると、文字化けが発生してしまいました。
日本語テスト
<?php header('Content-Type: text/html;charset=UTF-8'); ?> <html> <head><title>タイトルテスト</title></head> <body> <?php $fname = "hello.txt"; $file = fopen($fname, "r") or die("open error"); flock($file, LOCK_SH); while (!feof($file)) { $line = fgets($file, 1000); echo $line."<br>"; } flock($file, LOCK_UN); fclose($file); ?> </body> </html>
ちなみに、「http://localhost:8080/hello.txt」は表示できました。こちらはResinのWebコンテナが表示しているため問題とならないのでしょう。
ちょっと調べてみたところ、どうやら既存のPHPアプリを動作させることを優先して文字セットはISO-8859-1を前提としているようです。オプションで使用する文字セットの切り替えができるようなパッチを作成してフィードバックをするのがベストなのですが、その処理は意外と難しいものです。HTMLのmetaタグ、PHPのheader関数、OSのデフォルトエンコーディングなどが複雑に関係してくるからです。しかし、勉強で作成する程度の簡単なPHPアプリで日本語を使えるようにするぐらいのことはしたいところです。
こんなとき、オープンソースは自分で改良して使えます。resin-3.1.0-src.tar.gzを展開して、com.caucho.quercusパッケージ内のコードをのぞいてみました。なお、動作中のResinは、あらかじめ停止し、Binary版は名前を変更しておく必要があります。
$ ~/resin-3.1.0/bin/httpd.sh stop $ mv ~/resin-3.1.0 ~/resin $ cd ~ $ unzip resin-3.1.0-src.zip $ cd resin-3.1.0/modules/quercus/src/com/caucho/quercus $ grep 8859 `find . -name "*.java" -print`
いくつか検索はマッチしますが、その中で「./lib/i18n/UnicodeModule.java」の"ISO-8859-1"を"UTF-8"とし、「./lib/HttpModule.java」の"iso-8859-1"を"UTF-8"と修正してコンパイルをし直しました。コンパイルに当たっては、Source版には含まれていないJARファイルがいくつか必要なので、resin-3.1.0/modules/ext/ディレクトリを自分で作成してから、そこへ次のJARファイルをBinary版のlibディレクトリからコピーする必要がありました。
activation.jar javamail-14.jar jaxb-api.jar jaxb-impl.jar jaxb-xjc.jar jaxb1-impl.jar jaxrpc-15.jar
コンパイルはApache Antを使って行います。今回は使用したマシンにインストールしておいたapache-ant-1.6.4を使いました。手順としては、resin-3.1.0をカレントディレクトリとして、antコマンドを実行するだけです。
編集部注:Apache Antについての詳細を知りたい読者は、現場に活かすJakarta Projectの第2回「AntでJavaのビルドを簡単にしよう」をご参照願います。
コンパイルが成功したので、改良版のResinを起動し、文字化けが発生したプログラムを再度作成してアクセスしてみました。今度は、ばっちり日本語が表示されました。厳密にチェックしたわけではないので、不十分な部分もあると思いますが、こうやって何とかできてしまうときには、オープンソースはいいな、と感じます。
$ chmod 755 ~/resin-3.1.0/bin/httpd.sh $ ~/resin-3.1.0/bin/httpd.sh start
Copyright © ITmedia, Inc. All Rights Reserved.