小山博史のJavaを楽しむ(5)

【新人研修向け特別企画】
JavaでPHPを使ってみた


ガリレオ
小山博史
2007/4/12


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

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

info.php
<?php phpinfo() ?>

図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アプリケーションをすぐに開発し始めることができるわけです。

resin-3.1.0/conf/app-default.xml
<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を使えば何とかなる場合が増えてきているので、そのまま日本語が使えることを期待したのですが、見事期待どおりにきちんと使えました。

hello.php
<?php
    header('Content-Type: text/html;charset=UTF-8');
?>
<html>
    <head><title>タイトルテスト</title></head>
    <body>
<?php
    echo "日本語テスト"
?>
    </body>
</html>

図5 hello.phpの表示
図5 hello.phpの表示

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

hello.txt
日本語テスト

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>

図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版は名前を変更しておく必要があります。

com.caucho.quercusパッケージ内のコードをのぞく
$ ~/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ディレクトリからコピーする必要がありました。

libディレクトリからコピーするJARファイル
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を起動し、文字化けが発生したプログラムを再度作成してアクセスしてみました。今度は、ばっちり日本語が表示されました。厳密にチェックしたわけではないので、不十分な部分もあると思いますが、こうやって何とかできてしまうときには、オープンソースはいいな、と感じます。

改良版のResinを起動
$ chmod 755 ~/resin-3.1.0/bin/httpd.sh
$ ~/resin-3.1.0/bin/httpd.sh start

図8 filetest.phpの表示(文字化けしない)
図8 filetest.phpの表示(文字化けしない)

 

2/3

 INDEX
第5回 JavaでPHPを使ってみた
  Page1
Quercusとは、いったい何なのか?
新入社員の研修で試してみては?
Resinをインストールしてみよう!
  Resinを起動するには?
  ResinはServletを自動でコンパイル・実行
Page2
QuercusでPHPを動かしてみよう!
日本語を表示させるには?
Resinをカスタマイズするには?
  Page3
Pure JavaのDB、Derbyと連携させるには?
  PHPからDBにデータを挿入するには?
  PHPからDBを検索するには?
JavaクラスをPHPから使ってみよう!





Java Solutionコラム一覧



TechTargetジャパン

Java Solution フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

- PR -
@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る
- PR -

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH