「PHP」Java と連携する

PHPJava の連携について調べてみたので、その時のメモ。

調べてみると、PHP の拡張に Java と連携できる機能があるみたい。

PHP: Java - Manual
http://www.php.net/manual/ja/book.java.php

ただ、PHP 4 系までしか、この拡張モジュールは用意されてないみたいです。
ひとまず、今回は PHP 4 系で↑拡張モジュール使って Java と連携させてみました。

PHP 5 系等では、"Zend Server"、"PHP/Java Bridge" を使えってありますね。これについては今度やってみよう。


まず、PHP 4 系をインストールする。
Apache のインストールディレクトリは "/usr/local/apache2" を想定してます。

ドキュメントは以下になる。
PHP: Apache 2.x (Unixシステム用) - Manual
http://www.php.net/manual/ja/install.unix.apache2.php

以下の Web ページからソースコードをダウンロードしてくる。
PHP: Releases
http://www.php.net/releases/
※ "php-4.4.9.tar.gz" をダウンロードしてきました。

適当なディレクトリにおいて展開する。

tar zxvf php-4.4.9.tar.gz

configure を実行する

./configure --prefix=/usr/local/php/4.4.9 --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql --with-config-file-path=/usr/local/php/4.4.9 --with-java

※ インストールディレクトリは "/usr/local/php/4.4.9" とした。
php.ini の配置ディレクトリも "/usr/local/php/4.4.9" とした。
flex、bison が無いと怒られるので、無い場合は yum 等でインストールしておく。
Java の拡張モジュールを使用したい場合は "--with-java" の指定がいるようです。
PHP: インストール手順 - Manual
http://www.php.net/manual/ja/java.installation.php

make、make install する。

make
make install

ひとまず、無事完了したっぽい。

cd /usr/local/php/4.4.9/bin
./php -v
PHP 4.4.9 (cgi) (built: Aug  8 2013 22:48:29)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies

php.ini をコピーする

cp php.ini-recommended /usr/local/php/4.4.9/
cd /usr/local/php/4.4.9/
mv php.ini-recommended php.ini

httpd.conf に LoadModule の設定が追加されていることを確認する。
この際に、ついでに AddType の設定を行なっておく。

LoadModule php4_module        modules/libphp4.so
 ( 略 )
AddType application/x-httpd-php .php

以上でインストールは完了。

動作確認するために、"/usr/local/apache2/htdocs" 配下に test.php として、以下を作成する。

<?php
  phpinfo()
?>

Apache を起動して、Web ブラウザから "http://XXX.XXX.XXX.XXX/test.php" にアクセスして phpinfo の画面が表示されたら OK かと思います。


ようやく Java との連携に・・・ ( 長かった )
Java のインストールディレクトリは "/usr/local/java/jdk1.6.0_34" を想定してます。

まずは、サンプルソースコードを作成します。ドキュメントにあるものをそのままコピペで。
PHP: 基本的な使用法 - Manual
http://www.php.net/manual/ja/java.examples-basic.php

<?php
$system = new Java('java.lang.System');

echo 'Java version=' . $system->getProperty('java.version') . '<br />';
echo 'Java vendor=' . $system->getProperty('java.vendor') . '<br />';
echo 'OS=' . $system->getProperty('os.name') . ' ' .
             $system->getProperty('os.version') . ' on ' .
             $system->getProperty('os.arch') . ' <br />';

$formatter = new Java('java.text.SimpleDateFormat',
                      "EEEE, MMMM dd, yyyy 'at' h:mm:ss a zzzz");

echo $formatter->format(new Java('java.util.Date'));
?>

php.ini にも設定が必要なようなので、"/usr/local/src/php-4.4.9/ext/java/README" を確認してみる。以下のような記述がある。

php.ini:

   [java]
   java.class.path=/home/rubys/php4/lib/php_java.jar
   extension_dir=/home/rubys/php4/modules
   extension=java.so

ただ、↑の設定しても動いてくれない・・・以下のようなエラーが発生しちゃう。

[Fri Aug 09 00:55:22 2013] [error] [client 192.168.1.3] PHP Fatal error:  Cannot instantiate non-existent class:  java in /usr/local/apache2/htdocs/php/javaSample.php on line 2

ちょっと Web を調べてみると、以下のような情報あったので、参考に php.ini を設定し直す。
・RADKRAFT: PHP: Java extension
http://www.geocities.jp/misurano/oswa/phpjava.html

[java]
java.class.path=/usr/local/php/4.4.9/lib/php/php_java.jar
java.home = /usr/local/java/jdk1.6.0_34
java.library = /usr/local/java/jdk1.6.0_34/jre/lib/i386/server/libjvm.so
java.library.path = /usr/local/php/4.4.9/lib/php/extensions
extension_dir = /usr/local/php/4.4.9/lib/php/extensions/
extension = libphp_java.so

また、"/usr/local/php/4.4.9/lib/php/extensions/no-debug-non-zts-20020429" にある "java.so" をひとつ上のディレクトリにコピーしておく。そして、"java.so" に対して "libphp_java.so" といった名前でシンボリックリンク貼っておく。

cp java.so ../
ln -s java.so libphp_java.so

以下のような出力が得られて、無事動きました ( 情報の提供者様、ありがとうございます )。

Java version=1.6.0_34
Java vendor=Sun Microsystems Inc.
OS=Linux 2.6.32-220.el6.i686 on i386 
金曜日, 8月 09, 2013 at 12:58:52 午前 GMT+09:00

長くなりましたが、以上です。