連載
» 2007年04月12日 00時00分 公開

【新人研修向け特別企画】JavaでPHPを使ってみた小山博史のJavaを楽しむ(5)(2/3 ページ)

[小山博史,ガリレオ]

QuercusでPHPを動かしてみよう!

 Servlet/JSPコンテナとしての動作は確認できたので、次にResinのQuercusの動作確認をしてみました。次のようなinfo.phpファイルをwebapps/ROOTにおいて、「http://localhost:8080/info.php」へアクセスするだけです。この結果から、PHP 5.0.4であることやシステムのカーネルが何かなどが分かります。後は、同様にしてPHPのプログラムを追加していけば、PHPプログラミングができます。標準APIは基本的にサポートしているので、基本的なプログラミングで困ることはなさそうです。

<?php phpinfo() ?>
info.php
図4 info.phpの表示 図4 info.phpの表示

 さて、特に設定をしなくても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>
resin-3.1.0/conf/app-default.xml

日本語を表示させるには?

 次に、日本語を含む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>
hello.php
図5 hello.phpの表示 図5 hello.phpの表示

 ファイルからのデータ読み込みもしてみました。filetest.phpというPHPプログラムで、次のようにUTF-8で保存したテキストファイルであるhello.txtを開いて表示するだけの単純なものです。このプログラムは残念なことに、「http://localhost:8080/filetest.php」とアクセスすると、文字化けが発生してしまいました。

日本語テスト
hello.txt
<?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>
filetest.php
図6 filetest.phpの表示(文字化けしてしまう) 図6 filetest.phpの表示(文字化けしてしまう)

 ちなみに、「http://localhost:8080/hello.txt」は表示できました。こちらはResinのWebコンテナが表示しているため問題とならないのでしょう。

図7 hello.txtの表示 図7 hello.txtの表示

 ちょっと調べてみたところ、どうやら既存のPHPアプリを動作させることを優先して文字セットはISO-8859-1を前提としているようです。オプションで使用する文字セットの切り替えができるようなパッチを作成してフィードバックをするのがベストなのですが、その処理は意外と難しいものです。HTMLmetaタグ、PHPのheader関数、OSのデフォルトエンコーディングなどが複雑に関係してくるからです。しかし、勉強で作成する程度の簡単なPHPアプリで日本語を使えるようにするぐらいのことはしたいところです。

Resinをカスタマイズするには?

 こんなとき、オープンソースは自分で改良して使えます。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`
com.caucho.quercusパッケージ内のコードをのぞく

 いくつか検索はマッチしますが、その中で「./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
libディレクトリからコピーする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
改良版のResinを起動
図8 filetest.phpの表示(文字化けしない) 図8 filetest.phpの表示(文字化けしない)

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。