`
z75148885
  • 浏览: 191317 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

连接PHP和 Java -- PHP/Java Bridge [1]

阅读更多

在WEB开发市场中,Java和PHP都是目前应用的热门技术。Java的强大是不容置疑的,不仅体现在WEB开发上,在各个软件应用领域,Java无所不在。而PHP在开源力量及ZEND,IBM,Oracle等公司的推动之下也日渐繁荣。不一定会有人相信互联网先锋人物Marc Andreessen 的预言“PHP将比Java更受欢迎”,但是“PHP瞄准企业市场,和Java展开正面较量”确实正在进行中,全球2200万个网站所采用的技术让人不得不重视。

  两种技术可以激烈竞争,也可以紧密合作。从客户的角度来说,技术之间的融合非常重要,因为一个庞大的应用系统,通常不可能由单一语言/和技术独立完成。PHP/Java Bridge的出现就将成为PHP和Java间的一道桥梁,为需要结合PHP与Java的企业提供一个良好的选择。

  //Haohappy对J2EE了解不深,如果有相关内容理解错误,欢迎批评指教。

  (一)什么是JSR,什么是JSR223 ?

  JSR(Java 规范请求)是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR(Java 规范请求),以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。

  在Java Servlet规范(Servlet 2.4,JSR-154)中,定义了一系列核心的抽象概念(WEB程序处理过程中需要考虑的各种对象)来让Java程序员编写WEB程序,包括session,request,response等等。当程序员在编写程序的时候,可以很方便安全地与这些对象进行通讯。JSR223描述的是这些Java对象如何向用其它脚本语言编写的WEB页面开放,使其它语言也可以访问这些对象。当前这个规范将被用于PHP,不过这种概念是独立于脚本语言的,也就是说在将来可能被应用于PHP之外的其它脚本语言。一句话,JSR223的目的是将脚本语言集成到Java平台之上。

  (二) 什么是PHP/Java Bridge ?

  PHP/Java Bridge包含一个PHP模块(包括java.so,php_java.dll)和一个相关的后端程序(JavaBridge.jar,JavaBridge.war或MonoBridge.exe),用于连接PHP的对象体系到Java或ECMA 335(CLI, Microsoft .NET Framework的重要子集)虚拟机。 它完全实现了JSR 223规范请求,可以使PHP脚本访问基于CLR(如VB.NET,C#)或Java(Java,KAWA,JRuby)的应用程序。PHP/Java Bridge通过本地socket用一个高效的通讯协议与虚拟机进行通讯。一个多进程的HTTP服务器的每个处理请求的PHP进程都会有一个相应的虚拟机进程。

  多个HTTP服务器的请求会被集中发送到一个运行着PHP/Java Bridge的应用服务器,或者每个HTTP服务器都有一个PHP/Java Bridge并和一个J2EE应用服务器进行通讯,必需的客户端类库(ejb client.jar)将在运行时被加载。

  如果在ECMA虚拟机内至少有一个后端程序在运行,例如Novell的MONO或Microsoft的 .NET,那么基于ECMA 335的类就可以被访问,也可以支持varargs, reflection,assembly loading等特性。

  如果在J2EE环境中有一个后端程序运行,PHP和JSP间就可以实现session共享,可以实现集群和负载平衡。

  和以前的尝试 (ext/java 或 JSR223 的示例)不同,PHP/Java Bridge不再使用JNI(Java本地接口)。PHP对象将从HTTP(Apache/IIS)池而来,而Java/J2EE的对象从后端程序中分配而来。对象间通过“通讯传递样式(continuation passing style)”来进行通讯,见下面的java_closure()。一旦一个PHP对象崩溃,不会影响到Java应用服务器和servlet引擎。

  从PHP/Java Bridge version 3.0开始,我们也可以把Java作为PHP脚本的一个运行环境。Java代码可以分配和调用PHP脚本,通过一个外部或内部的Java池。脚本对象可以来自于外部的HTTP池,或内部的php FastCGI池或直接使用php CGI。这个功能需要Java 6(预计2006年上半年推出) 或外部的javax.script包。

三)为什么要使用 PHP/Java Bridge?

PHP中的组件都是短暂,非持久化的。如果是复杂应用体系,我们需要提供中间层组件(java beans/EJB)或者企业级的提供缓存,连接池或商业逻辑给PHP组件生成的页面。例如解析XML文件就是一个比较耗资源的工作,需要缓存;连接数据库也是个比较耗资源的工作,所以需要能够重用。标准的PHP XMLDB抽象层都是比较没效率的,因为它们都不能通过一个中间层来实现缓存和连接池。

即使是一些小任务,也可能需要用到Java ClassJava类库,例如需要跨平台地生成Word,ExcelPDF文档。

PHP,PHP/Java Bridgephp代码可以打包成标准的J2EE档案包格式,用户可以方便地布置到一个J2EE应用服务器或servlet引擎中去。用户不需要安装PHP,而且从他们的角度来说,他们看不到这些用JSP,servletPHP生成的页面有什么区别。由于Bridge允许PHPJ2EE间的session共享,开发者可以一步步地把基于JSP的程序和PHP集成起来。

上面是说为什么PHP需要Java。而对于Java程序员来说,PHPPHP/Java Bridge也可能是有用的。 现在有许多基于JSP模板系统的技术如jakarta Struts及更新一代技术Java Server FacesJSP和自定义标签库有很多缺陷,把它们整合在一起去建立一个面向对象的WEB Framework暴露了这些问题。即使JSF的作者也承认了这样的系统是有严重缺陷的,并推荐像tapestryfacelets 这样用Java类定义组件并通过他们的ID来绑定到XML/HTML模板中。PHP/Java Bridge version 3.0可以嵌入PHP代码到JSF Framework中,这样用户界面设计师集中精力在设计HTML模板,而程序员可以用PHP建立原型,并使用已有的开发框架。现在不少大型站点就在前端使用PHP,而核心使用Java来构建系统。

PHP/Java Bridge添加了下面这些原始类型和函数到PHP中,以使PHP可以方便地访问Java对象。在表格1中可以看到数据类型的分布情况。

 

new Java("CLASSNAME"): References and instanciates the class CLASSNAME. After script execution the referenced classes may be garbage collected.

  • new JavaClass("CLASSNAME"): References the class CLASSNAME without creating an instance. The object returned is the class object itself, not an object of the class. After script execution the referenced classes may be garbage collected. Example:

java_require("JAR1;JAR2"): Makes additional libraries available to the current script. JAR can either be a "http:", "ftp:", "file:" or a "jar:" location. On "Security Enhanced Linux" (please see the README) the location must be tagged with a lib_t security context.

java_context(): Makes the javax.script.ScriptContext available to the current script. Available since PHP/Java Bridge version 3.0.

java_closure(ENVIRONMENT, MAP, TYPE): Makes it possible to call PHP code from java. It closes over the PHP environment and packages it up as a java class. If the ENVIRONMENT is missing, the current environment is used. If MAP is missing, the PHP procedures must have the same name as the required procedures. If TYPE is missing, the generated class is "generic", i.e. the interface it implements is determined when the closure is applied.

The java_closure can also be used to emulate try/catch functionality in PHP4.

$session=java_session(): Creates or retrieves a session context. When the backend is running in a J2EE environment, the session is taken from the request object, otherwise it is taken from PHP.

$session=java_session(SESSIONNAME): Creates or retrieves the session SESSIONNAME. This primitive uses a "private" session store with the name SESSIONNAME.

The java_session primitive is meant for values which must survive the current script. If you want to cache data which is expensive to create, bind the data to a class.

  • JavaException: A java exception class. Available in PHP 5 and above only. Example:

 

foreach(COLLECTION): It is possible to iterate over values of java classes that implement java.util.Collection or java.util.Map. Available in PHP 5 and above only.

[index]: It is possible to access elements of java arrays or elements of java classes that implement the java.util.Map interface. Available in PHP 5 and above only.

java_instanceof(JAVA_OBJ, JAVA_CLASS): Tests if JAVA_OBJ is an instance of JAVA_CLASS.

  • java_last_exception_get(): Returns the last exception instance or null. Since PHP 5 you can use try/catch instead.
  • java_last_exception_clear(): Clears the error condition. Since PHP 5 you can use try/catch instead.


 

Table 1. 数据类型映射表

PHP

Java

Description

Example

object

java.lang.Object

An opaque object handle. However, we guarantee that the first handle always starts with 1 and that the next handle is n+1 for all n < 1024 (useful if you work with the raw XML protocol, see the python and scheme examples).

$buf=new java("java.io.ByteArrayOutputStream");
$outbuf=new java("java.io.PrintStream", $buf);

null

null

NULL value

$outbuf->println(null);

exact number

long

64 bit integer

$outbuf->println(100);

boolean

boolean

boolean value

$outbuf->println(true);

inexact number

double

IEEE floating point

$outbuf->println(3.14);

string

byte[]

binary data, unconverted

$bytes=$buf->toByteArray();

string

java.lang.String

An UTF-8 encoded string. Since PHP does not support unicode, all java.lang.String values are auto-converted into a byte[] (see above) using UTF-8 encoding. The encoding can be changed with the java_set_file_encoding() primitive.

$string=$buf->toString();

array (as array)

java.util.Collection or T[]

PHP4 sends and receives arrays as values. PHP5 sends arrays as values and receives object handles which implement the new iterator and array interface.

// pass a Collection to Vector
$ar=array(1, 2, 3);
$v=new java("java.util.Vector", $ar);
echo $v->capacity();

// pass T[] to asList()
$A=new JavaClass("java.util.Arrays");
$lst=$A->asList($ar);
echo $lst->size();

array (as hash)

java.util.Map

PHP4 sends and receives hashtables as values. PHP5 sends hashtables as values and receives object handles which implement the new iterator interface.

$h=array("k"=>"v", "k2"=>"v2");
$m=new java("java.util.HashMap",$h);
echo $m->size();

JavaException

java.lang.Exception

A wrapped exception class. The original exception can be retrieved with $exception->getCause();

...
catch(JavaException $ex) {
echo $ex->getCause();
}



本模块在Mandrake Linux 9.2,RedHat Enterprise 3, RedHat Fedora Core 1..4, FreeBSD 5.3, Solaris 9 (Sparc, 64 bit JVM) Windows RedHat (Cygwin虚拟)各种平台均通过测试, 理论上说可以运行于所有*nix操作系统。

PHP/Java Bridge可以在4种不同模式下运行:

  1. 通过dl()函数调用。在这种模式下,当HTTP服务器接收一个客户请求并反映结束后,开始调用PHP/Java Bridge。速度很慢,因为为每次请求都要重新启动Java虚拟机,但不需要任何系统管理权限。
  2. 通过HTTP服务器内部运行的Java进程持久性地激活全局配置文件php.ini。这种模式下PHP/Java Bridge是在HTTP服务器启动后启动,停止后停止。在开发测试过程中推荐使用这种模式。
  3. 通过外部的Java进程来持久性地激活全局配置文件php.ini。推荐用于产品系统中(即系统正式运行时)。这种模式类似于RedHat LinuxRPM包的实现方式。这种模式下PHP/Java Bridge作为系统服务。
  4. 通过外部的应用服务器或servlet引擎来激活php.ini文件。PHP可以作为纯Java应用服务器的CGI子组件运行,或者安装为Apache/IIS模块。
分享到:
评论

相关推荐

    php-java-bridge_7.2.1_documentation.zip

    1. **安装JavaBridge.jar和Java.inc**:首先确保你的系统中已经安装了Java运行环境。然后将JavaBridge.jar和Java.inc文件放入项目的合适目录。 2. **启动Java Bridge服务器**:通过Java命令行启动JavaBridge.jar,...

    php-java-bridge 配置包

    2.把下载的JavaBridge.jar直接用winrar打开,把这个jar包拷到 你的php目录的ext/下。 3.打开war包,里面有个java的文件夹,把他全部拷到你的项目下,如/demo/java 4.目前的版本是VMBridge了,要php调用java类,要先...

    PHP/Java Bridge的JavaBridge.jar、php-servlet.jar和php-script.jar

    这个技术的关键在于它的几个核心组件,其中包括JavaBridge.jar、php-servlet.jar和php-script.jar,这些都是在Java和PHP集成环境中不可或缺的部分。 1. **JavaBridge.jar**: JavaBridge.jar是PHP/Java Bridge的...

    PHP-Java-Bridge

    2. **部署JavaBridge.jar**:将JavaBridge.jar放在服务器的适当位置,并确保Java守护进程可以访问。 3. **配置PHP**:将Java.inc添加到PHP的include_path中,以便PHP脚本可以轻松地引入和使用。 4. **启动Java守护...

    script-api.jar,php-servlet.jar,php-script.jar,JavaBridge.jar, java.inc

    有时,开发者需要在Java平台上运行PHP代码,这就需要用到JavaBridge和Tomcat的支持。本文将详细讲解标题和描述中涉及的知识点,以及如何在Tomcat服务器上配置这些jar包以实现PHP与Java的集成。 首先,我们来看一下...

    将PHP/Java Bridge的JavaBridge.jar、php-servlet.jar和php-script.jar

    1. **JavaBridge.jar**:这是PHP/Java Bridge的核心组件,它提供了一个Java服务器端接口,使得PHP能够调用Java类和方法。JavaBridge.jar通过HTTP协议工作,允许PHP代码通过HTTP请求与Java应用程序进行交互。这使得...

    php-java-bridge_6.2.1_documentation

    JavaBridge.war是PHP-Java Bridge的服务端组件,包含了处理PHP请求的Java代码。部署后,这个WAR文件会被解压并运行,提供PHP调用Java的接口。开发者可以通过HTTP GET或POST请求来调用Java方法。 5. PHP端调用Java ...

    JavaBridge.jar,php-script.jar,php-servlet.jar,script-api.jar

    1. **JavaBridge.jar**: 这个文件提供了Java和PHP之间的桥梁,它实现了PHP语言的调用Java API的能力。JavaBridge使得PHP能够直接调用Java类库,扩展了PHP的功能,比如访问Java的数据库连接池、企业级服务等。它通过...

    基于java的开发源码-PHPJava Bridge.zip

    基于java的开发源码-PHPJava Bridge.zip 基于java的开发源码-PHPJava Bridge.zip 基于java的开发源码-PHPJava Bridge.zip 基于java的开发源码-PHPJava Bridge.zip 基于java的开发源码-PHPJava Bridge.zip 基于java的...

    php-java-bridge_7.2.1_documentation.rar

    在PHP Java Bridge中,`birtreportlib`可能是用于连接和执行BIRT报表的相关库,它使得PHP能够调用BIRT的功能,例如创建、运行和渲染复杂的报表。 2. **META-INF**:在Java世界中,`META-INF`目录是包含元数据的特殊...

    PHP/Java bridge

    PHP/Java bridge , call php in java and call jacva in php. Java as backend and php as a front end.

    JavaBridge.jar,php-servlet.jar

    JavaBridge.jar 和 php-servlet.jar 是两个在 PHP 与 Java 集成环境中常见的库文件,主要用于在 Apache Tomcat 或其他 Java 应用服务器上运行 PHP 脚本。这两个组件构成了一个桥梁,使得 PHP 可以利用 Java 的强大...

    tomcat运行php项目必须的jar包:JavaBridge.jar,php-servlet.jar和php-script.jar

    tomcat运行php项目必须的jar包:JavaBridge.jar、php-servlet.jar和php-script.jar 将下载好的JavaBridge.jar、php-servlet.jar和php-script.jar复制到tomcat的lib目录下; 并且完成配置, 教程链接:...

    apacheTomcat配置运行php,所需jar包JavaBridge,php-script,php-servlet,script-api

    1. **JavaBridge**:JavaBridge是Java和PHP之间的一个桥梁,它允许PHP代码调用Java类和方法,反之亦然。通过JavaBridge,PHP可以利用Java的性能和功能,例如访问数据库、使用Java库或服务。在Tomcat中配置JavaBridge...

    JavaBridge.jar、php-script.jar、php-servlet.jar

    1. 将JavaBridge.jar、php-script.jar和php-servlet.jar添加到Tomcat的lib目录下,这样Tomcat就可以访问这些库。 2. 配置Tomcat的web.xml文件,定义一个Servlet来处理.php请求,并指定使用php-servlet.jar中的...

    php java bridge

    1. **JavaBridge.jar**:这是PHP Java Bridge的核心组件,实现了PHP和Java之间的通信协议。它提供了PHP调用Java方法和Java调用PHP函数的能力。JavaBridge.jar包含了处理网络请求、序列化和反序列化数据以及执行Java...

    PHP通过javabridge6.2.1调用 Java的说明及源代码(可运行)

    本篇文章将详细讲解如何通过PHP的JavaBridge 6.2.1版本来调用Java代码,并提供一个可运行的实例和源代码。 首先,JavaBridge是PHP与Java之间的一个桥梁,它允许PHP脚本直接调用Java类和方法,从而实现PHP应用与Java...

    JavaBridge.jar php-servlet.jar php-script.jar

    JavaBridge.jar ... PHP/Java Bridge的JavaBridge.jar、php-servlet.jar和php-script.jar复制到tomcat的lib目录下. http://www.laokboke.net/2011/12/04/how-to-deploy-php-app-to-tomcat/

    php调用自己java程序的方法详解

    找到`JavaBridge.war`文件,使用WinRAR打开并提取`WEB-INF/lib/JavaBridge.jar`到PHP的`ext`目录下。 接下来,将`JavaBridge.war`中的`java`文件夹复制到PHP项目的相应位置,例如`/demo/java`。当前版本的桥接器为...

Global site tag (gtag.js) - Google Analytics