教育界、技術者コミュニティでJava言語の教育と啓蒙に長年携わってきた筆者が、独自の視点からJavaの面白さを掘り下げていく。(編集部)
Webサービスを実装する際によく使われるプログラミング言語として、Java以外には何があるでしょうか?
RoR(Ruby on Rails)の出現によりRubyが最近は注目されていますが、普及度を考えるとPHPではないでしょうか。数年前には、LAMP(Linux、Apache HTTP Server、MySQL、PHP)という用語が流行しました。もちろん、LAMPのPはPerlやPythonを意味する場合もあるようですが、筆者がよく使用しているWebアプリケーションはJavaかPHPでコーディングされたものが多いので、PHPの方をすぐに想像してしまいます。今回は、Javaで記述されたPHP実行エンジンがあるということで調べてみました。
Quercusと聞いてピンとくる人はあまりいないでしょうが、Resinといわれるとポンと手をたたく人は多いと思います。
Quercusは、Resinで有名なCaucho Technology社が開発しているPHP 5の実行環境で、100% Javaで実装されています。ライセンスはGPLで、つい最近にQuercusのサイトが公開されたばかりです。
少し前まで、ResinはServlet/JSPコンテナという印象を個人的には持っていたのですが、いつの間にか高性能なJava/PHPアプリケーションサーバとなっていました。Resinのオープンソース版はGPLで公開されていますが、プロフェッショナル版はライセンスを購入する必要がありますから、注意が必要です。
せっかくPure JavaのPHP実行エンジンがあるので、Java好きなプログラマがPHPのプログラムを作るなら、これを使ってみたくなってしまうのは、当たり前のことでしょう。純粋にPHP実行エンジンとして利用するのであれば、Quercusだけがあればよいので、Quercusのサイトから入手して使います。Webアプリケーションとして動かすのであれば、Resinに同梱されていた方がすぐに使えます。そこで、Resinからオープンソース版をダウンロードして、Webアプリケーションを動かしてみました。
PHPを動作させるためのプラットフォームとしては、真っ先にApache HTTP Server+PHPを思い付くので、なぜこちらを使わないのかと不思議に思う人もいるかもしれません。しかし、ちょっとしたPHPプログラムを勉強したいといった場合に、これらをインストールして動作させるように環境を構築するのは意外と大変です。
もちろん、プロならLinux+Apache HTTP Server+PHP+JDK+Apache Tomcat+MySQLの環境は普段から使えるように構築していることが多いでしょうから、あまりありがたみを感じないかもしれません。しかし、あまりリソースがないマシンで軽いWebアプリケーションを複数動作させる必要があり、それらがPHPアプリとServlet/JSPアプリであった場合などには、Resinのようなサーバアプリがあるとうれしいはずです。新入社員の研修実習でPHPとServlet/JSPの入門を行う場合などにも、有効でしょう。
そのほかにも、mod_phpで動作させるよりResinの方が速いとか、モジュールをJavaで実装できるからC/C++より速く開発できるとか、Javaの資産を利用できるとか、いろいろあるようですが、詳細はQuercus: PHP in Java当たりを読んでもらえれば、分かると思います。
インストールは非常に簡単です。Caucho Technologyのサイトからダウンロードを選んで使用するプラットフォームに応じてファイルを手に入れます。ここでは、Resin 3.1 BinaryのUNIX版とSource版を入手しました。つまり、resin-3.1.0.tar.gzとresin-3.1.0-src.zipとをダウンロードしました。
今回はFedora Core 5で動作させてみたので、Binary版のアーカイブファイルを展開してから、JNIライブラリを作成しました。このとき、JDK 6ではコンパイルがうまくできなかったので、ここではJDK 5を使うことにしました。Javaの切り替えはLinuxだと、JAVA_HOMEとPATHを指定し直せばよいだけなので簡単です。
$ export JAVA_HOME=/usr/java/jdk1.5.0 $ export PATH=$JAVA_HOME/bin:$PATH $ tar xzf resin-3.1.0.tar.gz $ cd resin-3.1.0 $ ./configure --with-java-home=/usr/java/jdk1.5.0 $ make $ make install
JNIライブラリのインストールが終わってから、コマンドはbin/httpd.shを使ってサーバの起動をしました。デバッグ情報はほとんど出ないため、結構あっさりしたメッセージが出力されて待機状態になります。なお、サーバを停止するには、パラメータstartの代わりにstopを使います。
$ ~/resin-3.1.0/bin/httpd.sh start
サーバの起動ができたら、「http://localhost:8080/」へアクセスすると、Resinのページを見ることができます。
設定ファイルはconf/resin.confになるので、ポート番号を変えたい場合などはそちらを編集します。動作確認のためにJSPファイルを追加する場合はwebapps/ROOTにJSPファイルを置きます。例えば、hello.jspを置いたら、「http://localhost:8080/hello.jsp」で閲覧できます。
<% out.println("Hello"); %>
ちなみに、Servletはwebapps/ROOT/WEB-INF/classesにJavaソースコードを置いて、webapps/ROOT/WEB-INF/web.xmlを作成すれば、実行できます。例えば、simpleサーブレットとしてSimpleServlet.javaを作成すると、「http://localhost:8080/simple」でアクセスできます。試しに、次のファイルを置いて、確認をしてみました。
<web-app> <servlet servlet-name="simple-servlet" servlet-class="SimpleServlet"/> <servlet-mapping url-pattern="/simple" servlet-name="simple-servlet"/> </web-app>
import javax.servlet.*; import javax.servlet.http.*; public class SimpleServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException{ response.getWriter().println("Simple"); } }
自動でソースコードをコンパイルして実行してくれるので、非常に便利です。ところが、コンパイルエラーが発生するプログラムを置いた場合は、コンパイルが成功しません。当然のことですね。
IDEで開発している場合はこれでもよいのでしょうが、そうでない場合は、よほど簡単なプログラムでない限り、自分でコンパイルをして確認してから、WEB-INF/classesへ置くようにした方がよさそうです。ということで、Servletプログラムを自分でコンパイルしたいときはどうすればよいかというと、次のように、jsdk-15.jarなど必要なライブラリやクラスへのクラスパスを指定しながらjavacコマンドを使います。
$ cd ~/resin-3.1.0/webapps/ROOT/WEB-INF/classes/ $ javac -cp ~/resin-3.1.0/lib/jsdk-15.jar SimpleServlet.java
Copyright © ITmedia, Inc. All Rights Reserved.