分类: LINUX
2010-04-20 19:41:49
Php是在apache下面解析的,而java类是在tomcat下面解析的,我之前的web服务都是部署在了tomcat下面,因为目前要转移web服务,使用phprpc修改为三层架构,所以尝试一下使用php调用java。
以下的配置都是基于php-java-bridge,下面的介绍出自ibm官网http://www.ibm.com/developerworks/cn/aix/library/au-javaphpaix5。
PHP Java Bridge 是一种经过优化的、基于 XML 的协议,它允许您在 PHP 应用程序中直接使用 Java 类。尽管从理论上讲,它的工作方式类似于 SOAP,但是实际上,它比 SOAP 方法的效率要高得多。
该系统使用 JSR 223 接口进行工作。PHP 组件可以与任何 ECMA-335 后端系统通信,其中包括 Java 技术、基于 Java 的扩展接口(如 JPython 和 JRuby),部署公共语言运行时(Common Language Runtime,CLR)的 .NET 应用程序、甚至还包括 .NET 兼容的解决方案(如 Mono)。
这个过程是双向的:PHP 脚本可以调用 Java/.NET 类,或者 Java 组件可以调用 PHP 类或脚本。甚至可以将这种桥接集成到解决方案中,以便在请求一个类的时候,允许自动地启动后端系统(Apache/IIS 和 PHP、或者 .NET、或者 Java/Tomcat)。
该系统通过访问 Tomcat 应用服务器上的一个远程类进行工作。当您运行 PHP 应用程序时,它从远程 Java 应用程序服务平台加载 PHP Java Bridge 代码。这将初始化系统,并使得 PHP 脚本知道如何与该应用服务器上的远程 Java 类进行通信。
很显然,为了能够使用 PHP Java Bridge 访问您的 Java 类,您必须在安装 PHP Java Bridge 之前,安装 Apache 和 PHP。
下面是配置过程:
1. 首先要保证你的系统已经装上了apache和php,以及tomcat、jdk,这些文件的安装网络上比较全,在此不多赘述。
2. 将下载的javabridge.war文件直接拷贝到tomcat的webapps目录下面,然后重启tomcat,之后你会发现在tomcat的webapps目录下面多了一个JavaBridge目录,其java目录下包含了我们要调用的Java.inc文件。Javabridge官网:
3. 然后在浏览器里访问,看到如下所示,证明你的tomcat正确解析了这个包。
php/java bridge examples
…………
4. 但是在默认的情况下,PHP Java Bridge 配置为不允许来自非本地服务器的连接。这意味着,如果您希望将您的应用程序部署到不同的服务器,那么可能会阻止您的连接。要更改这项配置,您需要更改 JavaBridge 应用程序所使用的参数。要实现这一点,可以编辑 JavaBridge 部署的 Web 应用程序目录中的 web.xml 文件。它应该是 Tomcat 安装目录中的 webapps/JavaBridge/WEB-INF/web.xml 文件。 您需要取消对这个部分的注释,以便允许对您的 Java 类进行远程访问
5. 和JavaBridge类似,php配置默认属性也是不允许远程文件的包含,要修改这个属性,就要编辑php.ini文件,将下面两个属性打开
allow_url_fopen = On
allow_url_include = On(这个属性可能要添加)
6. 在apache的目录/var/www/html/下面写一个测试php页面,内容如下:
1
2 //require_once("/usr/local/tomcat/webapps/JavaBridge/java/Java.inc");
3 require_once("");
4 $System = new Java("java.lang.System");
5 $te = $System->getProperties();
6 echo $te;
7 ?>
7. 在浏览器中访问,如果能看到如下内容,则你的 apache 可以访问到本机的java类了。
{java.runtime.name=Java(TM) SE Runtime Environment, sun.boot.library.path=/usr/java/jdk1.6.0_17/jre/lib/i386, java.vm.version=14.3-b01, shared.loader=, java.vm.vendor=Sun Microsystems Inc., java.vendor.url= path.separator=:, tomcat.util.buf.StringCache.byte.enabled=true, java.util.logging.config.file=/usr/local/tomcat/conf/logging.properties, java.vm.name=Java HotSpot(TM) Client VM, file.encoding.pkg=sun.io, sun.java.launcher=SUN_STANDARD, user.country=CN, sun.os.patch.level=unknown, java.vm.specification.name=Java Virtual Machine Specification, user.dir=/usr/local/tomcat/bin, java.runtime.version=1.6.0_17-b04, java.awt.graphicsenv=sun.awt.X11GraphicsEnvironment, java.endorsed.dirs=/usr/local/tomcat/endorsed, os.arch=i386, java.io.tmpdir=/usr/local/tomcat/temp, line.separator= , java.vm.specification.vendor=Sun Microsystems Inc., java.naming.factory.url.pkgs=org.apache.naming, java.util.logging.manager=org.apache.juli.ClassLoaderLogManager, os.name=Linux, sun.jnu.encoding=UTF-8, java.library.path=/usr/java/jdk1.6.0_17/jre/lib/i386/client:/usr/java/jdk1.6.0_17/jre/lib/i386:/usr/java/jdk1.6.0_17/jre/../lib/i386:/usr/java/packages/lib/i386:/lib:/usr/lib, java.specification.name=Java Platform API Specification, java.class.version=50.0, sun.management.compiler=HotSpot Client Compiler, os.version=2.6.11-1.1369_FC4, user.home=/root, catalina.useNaming=true, user.timezone=Asia/Shanghai, java.awt.printerjob=sun.print.PSPrinterJob, file.encoding=UTF-8, java.specification.version=1.6, catalina.home=/usr/local/tomcat, java.class.path=/usr/local/tomcat/bin/bootstrap.jar, user.name=root, java.naming.factory.initial=org.apache.naming.java.javaURLContextFactory, package.definition=sun.,java.,org.apache.catalina.,org.apache.coyote.,org.apache.tomcat.,org.apache.jasper., java.vm.specification.version=1.0, java.home=/usr/java/jdk1.6.0_17/jre, sun.arch.data.model=32, user.language=zh, java.specification.vendor=Sun Microsystems Inc., java.vm.info=mixed mode, sharing, java.version=1.6.0_17, java.ext.dirs=/usr/java/jdk1.6.0_17/jre/lib/ext:/usr/java/packages/lib/ext, sun.boot.class.path=/usr/java/jdk1.6.0_17/jre/lib/resources.jar:/usr/java/jdk1.6.0_17/jre/lib/rt.jar:/usr/java/jdk1.6.0_17/jre/lib/sunrsasign.jar:/usr/java/jdk1.6.0_17/jre/lib/jsse.jar:/usr/java/jdk1.6.0_17/jre/lib/jce.jar:/usr/java/jdk1.6.0_17/jre/lib/charsets.jar:/usr/java/jdk1.6.0_17/jre/classes, server.loader=, java.vendor=Sun Microsystems Inc., catalina.base=/usr/local/tomcat, file.separator=/, java.vendor.url.bug= common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar, sun.io.unicode.encoding=UnicodeLittle, sun.cpu.endian=little, package.access=sun.,org.apache.catalina.,org.apache.coyote.,org.apache.tomcat.,org.apache.jasper.,sun.beans.,
8. 下面自己写一个类,实现调用。内容如下:
1 package test;
2
3 public class Test{
4 private String t1="hello world!";
5 public String get(){
6 return this.t1;
7 }
8 public static void main(String args[]){
9 Test t = new Test();
10 System.out.println(t.get());
11 }
12 }
然后在和test目录同级的目录下写一个MANIFEST.MF文件,内容如下:
Main-Class:(空格)test.Test(回车)
MANIFEST.MF文件具有严格的结构,一定要按照这个格式写,如果包含了第三方包,一定要在第二行注明!
目录结构如下:
Xxxx
MANIFEST.MF
test
Test.java
然后在test目录同级执行jar cvfm test.jar MANIFEST.MF test/ 生成一个jar文件test.jar,用命令java –jar test.jar执行以下看是否可行。
9. 修改test.php的内容如下
1
2 //require_once("/usr/local/tomcat/webapps/JavaBridge/java/Java.inc");
3 require_once("");
4 $System = new Java("java.lang.System");
5 $te = $System->getProperties();
6 echo $te;
7 java_require("/root/");//一定要把刚才生成的jar文件放到这个require的目录下面
8 $objectKey = new java("test.Test");
9 $tes =$objectKey->get();
10 echo $tes;
11 ?>
刷新
你会看到比刚才看到的java环境内容多一行的Hello world内容。
后记:test.php文件的require_once的参数,如果是本机访问tomcat,可以写绝对路径,不用http形式的,如果是这一行出现错误,不妨写成绝对路径试试看,如果出现错误,一般是php.ini或者你的web.xml文件的两处修改没有做。还有就是如果没有看到想要的内容或者有什么错误,记得先重启一下apache或者tomcat试试看,柳暗花明,呵呵。
对照我的记录,你会hello world的!