在 PHP 下使用 Java
因系统需要在 PHP 下使用 Java,便做了相应的尝试,较为常见的是通过安装 PHP 自带扩展模块和安装 PJB(PHP/Java Bridge) 两种方式来实现。
先用 PHP 自带的扩展模块
系统环境:
CentOS4.5/Debian Etch
PHP-4.4.4
Apache-2.2.4
Apache, PHP 均为源代码编译安装。
安装 JDK:
# ./j2sdk-1_4_2_05-linux-i586.bin
Do you agree to the above license terms? [yes or no]
yes
其实就是解压到了当前目录,拷贝到 /usr/local 下:
# cp -ar j2sdk1.4.2_05 /usr/local/
设置环境变量:
# vi /etc/profile
JAVA_HOME=/usr/local/j2sdk1.4.2_05
CLASSPATH=${JAVA_HOME}/lib:${JAVA_HOME}/jre/lib
PATH=$PATH:${JAVA_HOME}/bin:${JAVA_HOME}/jre/bin
export JAVA_HOME CLASSPATH PATH
使环境变量生效(普通用户必须重新登陆环境变量才能生效):
# source /etc/profile
# java -version
应该能看到版本信息了。
重新安装 PHP,在编译时加上:
--with-java=/usr/local/j2sdk1.4.2_05
安装完成后,会在 PHP 的 lib 下(我的是在 /usr/local/php/lib/php)有个 php_java.jar,同时在扩展动态库存放的目录下(我的是在 /usr/local/php/lib/php/extensions/no-debug-non-zts-20020429)有个 java.so 文件。
配置 php.ini:
# vi /usr/local/php/etc/php.ini
文件末添加:
[java]
java.class.path=/usr/local/php/lib/php/php_java.jar
java.home=/usr/local/j2sdk1.4.2_05
java.library=/usr/local/j2sdk1.4.2_05/jre/lib/i386/libjava.so
java.library.path=/usr/local/php/lib/php/extensions/no-debug-non-zts-20020429
extension_dir=/usr/local/php/lib/php/extensions/no-debug-non-zts-20020429
extension=java.so
测试一下:
# vi java.php
<?php
$system=new Java("java.lang.System");
print 'Java version='.$system->getProperty('java.version');
?>
会有如下错误:
Fatal error: Unable to load Java Library /usr/local/j2sdk1.4.2_05/jre/lib/i386/libjava.so, error: libjvm.so: cannot open shared object file: No such file or directory in /www/java.php on line 2
设置 Apache 启动时的环境变量:
# vi /usr/local/apache/bin/apachectl
export LD_LIBRARY_PATH=/usr/local/j2sdk1.4.2_05/jre/lib/i386:
/usr/local/j2sdk1.4.2_05/jre/lib/i386/server
变成了如下错误:
Fatal error: java.lang.UnsatisfiedLinkError: no php_java in java.library.path in /www/java.php on line 2
Google 得到这样的说法:有些 PHP 版本生成的是 libphp_java.so 文件,extension 的加载只认 libphp_java.so。
那就做个链接:
# cd /usr/local/php/lib/php/extensions/no-debug-non-zts-20020429
# ln -s java.so libphp_java.so
再次执行,可以正常显示:
Java version=1.4.2_05
PHP 自带扩展模块运行 Java 的效率是比较低下的。
换为更加高效的 PJB(PHP/Java Bridge)。
项目主页:http://php-java-bridge.sourceforge.net/pjb/
新的 5.2.0 版不再支持 PHP4 了,应该下载 4.3.2 版的。
安装 JDK 并配置环境变量,并在安装完 PHP 后继续安装 PJB:
# tar zxvf php-java-bridge_4.3.2.tar.gz
# cd php-java-bridge-4.3.2
# /usr/local/php/bin/phpize
# ./configure --with-java=/usr/local/j2sdk1.4.2_05 --with-php-config=/usr/local/php/bin/php-config
# make
# make install
在 /usr/local/php/lib/php/extensions/no-debug-non-zts-20020429 目录下出现了这样几个文件:
javabridge.policy java.so php-script.jar script-api.jar JavaBridge.jar JavaBridge.war RunJavaBridge stamp
其中,JavaBridge.war 可以放到 Resin 或者 Tomcat 下发布出来。
配置 php.ini:
# vi /usr/local/php/etc/php.ini
[java]
extension="/usr/local/php/lib/php/extensions/no-debug-non-zts-20020429/java.so"
java.hosts="192.168.0.254:8080"
java.servlet=On
这下再执行 java.php,看到的是运行着 Resin 的远端服务器的 Java 版本了:
Java version=1.6.0
在 Debian 下配置 php.ini 时也使用:
extension="/usr/local/php/lib/php/extensions/no-debug-non-zts-20020429/java.so"
却出现了这样的错误:
Fatal error: Cannot instantiate non-existent class: java in /www/java.php on line 2
改为和加载 PHP 自带扩展模块一样的配置就可以了:
extension_dir="/usr/local/php/lib/php/extensions/no-debug-non-zts-20020429"
extension=java.so