从做PHP开发以来,很少会想到要在PHP代码中,调用Java的类。但今天就遇到了这么一个项目.
项目的大致需求是这样:Google 的Android手机系统,内的应用包是APK格式,但在做手机电子市场的过程中需要从APK包内的AndroidManifest.xml文件中,取到些应用的包名,版本名等一些具体的信息。然而现在遇到的问题是AndroidManifest.xml是经过编译的二进制文件,通过PHP就算可以解开APK包,便也无从解析出XML的信息。
所以就必须想办法用JAVA来解析出我们所需要的信息。当然,要解决些问题,可以借助一些工具,安装在服务器端。但我怕程序方面不好处理,目前想到的办法就是PHP-JAVA桥接的方式,来解决这个难题。现在大致的思路是这样:先让PHP可以调用JAVA内的类或是包,再通过JAVA去解析AndroidManifest.xml这个文件,返回过来的数据信息,就可以通过PHP再次处理(入库或是进行其他操作)。
按些思路,通过php.net搜索java就得到以下信息链接:http://cn.php.net/manual/en/java.installation.php 此页面内明确说明,
This extension doesn't seem to exist for PHP5.
If you need Java integration in PHP 5, there is the Java bridge of Zend Server (http://www.zend.com/en/products/server-ce/) and PJB (http://php-java-bridge.sourceforge.net/pjb/).
也就是说,可以通过二种方式实现PHP-JAVA的桥接。考虑到服务器目前环境,所以我选择第二种方式:
PJB(php-java-bridge).
现在我们在服务器上安装JAVA扩展:
我的服务器(测试机)环境和软件版本为:
centos 5.5 (32位)
apache 2.2
php 5.2.14
jdk-6u23-linux-i586.bin
php-java-bridge_4.0.7.tar.gz
现在进行下面的安装说明:
1.在服务器上安装JAVA。
a.下载最新版的jdk文件
下载最新版的jdk文件,根据你的服务器需求,选择对应的源文件。
下载载地址(可选择源文件):https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewProductDetail-Start?ProductRef=jdk-6u23-oth-JPR@CDS-CDS_Developer

选择好源文件后,开始下载文件:
wget http://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/VerifyItem-Start/jdk-6u23-linux-i586.bin?BundledLineItemUUID=hnSJ_hCurSgAAAEsViBZC..R&OrderID=yHeJ_hCuMukAAAEsPyBZC..R&ProductID=QhOJ_hCw.dUAAAEsFIMcKluK&FileName=/jdk-6u23-linux-i586.bin
b.开始安装java.
#cp jdk-6u23-linux-i586.bin /usr/local/java
#cd /usr/local/java
#chmod +x jdk-6u23-linux-i586.bin //让文件可执行
#./jdk-6u23-linux-i586.bin //执行后,此目录下会多出一个jdk1.6.0_23文件夹
#ln -s jdk1.6.0_23 jdk //此为加软链接,也可以省略
c.设置JAVA的环境变量。
运用vi编辑/etc/profile文件
#vi /etc/profile
加入:
export JAVA_HOME=/usr/local/java/jdk1.6.0_23
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar
再修改:
export JAVA_HOME PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC
退出保存.
让设置生效,则执行:
#source /etc/profile
或是重启(reboot)服务器.
d.查看java是否安装成功
#java -version
java version "1.6.0_23"
Java(TM) SE Runtime Environment (build 1.6.0_23-b05)
Java HotSpot(TM) Server VM (build 19.0-b09, mixed mode)
如果能看到类似上面的信息,代表你已成功安装JAVA。
2.安装php-java-bridge 扩展
a.下载php-java-bridge 扩展包,。
特别请大家注意,php-java-bridge包的版本请根据自己的的PHP版高低选择合适的。我就遇到很无语
的情况,开始选择了最新版,但是我的PHP版本不高,所以在执行phpize的时候总是出错,像这样:
Cannot find config.m4.
Make sure that you run '/usr/local/php/bin/phpize' in the top level source directory of the
module
php-java-bridge 主站在这里,请按你的环境选择下载对应的包:http://php-java-bridge.sourceforge.net/pjb/download.php
b.安装php-java-bridge
#tar -xzvf php-java-bridgeXX.XX.tar.gz
解压从网络上下载的文件。
#cd php-java-bridgeXX.XX
#phpize //会出现如下输出
Configuring for:
PHP Api Version: 20041225
Zend Module Api No: 20060613
Zend Extension Api No: 220060519
执行configure命令
#./configure --with-java=/usr/local/java/jdk1.6.0_23,/usr/local/java/jdk1.6.0_23/jre
执行make && make install
#make && make install
Installing shared extensions: /usr/lib/php/modules/
如果顺利的话,就会看到上面的输出信息。
3.配置php.ini,增加java扩展
打开并修改php.ini文件,在最后面增加:
java.class.path="/usr/lib/php/modules" //扩展目录
java.java_home="/usr/local/java/jdk1.6.0_23" //java安装目录
java.library="/usr/local/java/lib" //库文件目录
java.library.path="/usr/lib/php/modules/"
extension_dir="/usr/lib/php/modules/"
extension=java.so //java扩展
4.重启服务器并编辑测试文件
#service httpd restart
#vi index.php
输入以下代码:
<?php
$v = new java("java.lang.System");
$arr=$v->getProperties();
foreach ($arr as $key => $value) {
print $key . " -> " . $value . "<br>\n";
}
访问index.php,如果看到类似于以下内容,那么恭喜您,配置成功!现在您就可以开心地编写代码,实现您想要的功能了。

最后,谢谢以下几篇文章的作者,大家要是遇到什么问题可以参考以下几篇文章:
http://morgan363.javaeye.com/blog/807163
http://blog.saycoo.com/archives/88
http://blog.sina.com.cn/s/blog_51d3553f0100j5n3.html
http://blog.csdn.net/iloveolerp/archive/2009/03/26/4027831.aspx
http://www.linuxidc.com/Linux/2010-08/27586p2.htm