PHP是很流行的脚本语言。而BEA WebLogic服务器是专门为Java构建的应用服务器。如何才能同时使用这两种技术并从PHP和Java中受益呢?PHP-Java桥接器是方法之一。本教程将详细说明如何设置和使用两种不同的桥接器产品,从而将PHP和Java应用程序代码结合起来。
介绍:什么是PHP-Java 桥接器?
和WebLogic Server一起使用的PHP引擎(支持PHP语言的核心解释器)可用的实现都是本地代码。例如,引擎在它自己的操作系统的进程中运行,还必须和Web应用程序中其它进程(如Web服务器或者Java应用服务器)以某种方式进行通信。 就Java服务器而言,可以使用某种技术将通信过程非常透明地呈现给应用程序编程人员。有这样一种组件,它在两种环境之间不断地编组数据,并且提供了应用程序开发人员可以用来集成两种语言的PHP语言构造器。这种组件就是PHP-Java桥接器。
为什么要使用桥接器?
能够激发所有人的一个例子就是在同一个应用程序中结合使用Java和PHP,下面几种方法可以实现以下目的:
1.PHP 代码可以实例化并调用Java对象的方法,可以是POJO或者如EJB这样的Java EE资源。
2.可以使用WebLogic Server作为Web服务器,用于使用PHP编码的页面。
3.Java代码可以调用PHP脚本。
执行程序
当前有两种桥接器可以使用,并且都能够与WebLogic Server协同运作。一个是来自Zend Technologies Ltd的商业产品。另外一个是开源组件,得到LGPL(GNU Lesser General Public License宽通用公共许可证)许可,可从SourceForge获得。(还有第三种实现,位于php.net,但是这种产品已经被淘汰,因为它不能支持PHP的最新版本,因此本教程将不对其进行讨论。)
两种桥接器都允许PHP与WebLogic Server上的 Server POJOs和Java EE资源对话。可以通过JNDI访问WebLogic Server资源。下面的代码示例展示的PHP代码可以获取WebLogic Server上的资源,例如:EJB(数据库连接),JMS Queue。该代码可以使用两种桥接器。
// Get a reference to a container-managed resource from WebLogic Server
function getWebLogicResource($jndiName) {
// Set WebLogic-specific parameters for creation of jndi naming context:
// (weblogic.jar must be on the PHP-Java Bridge classpath)
$envt = array(
"java.naming.factory.initial" => "weblogic.jndi.WLInitialContextFactory",
"java.naming.provider.url" => "t3://localhost:7001" // replace with your target server URL
);
// The 桥接 creates the naming context object in the local JVM.
$ctx = new Java('javax.naming.InitialContext', $envt);
// Now JNDI crosses the network, to obtain the resource.
return $ctx->lookup($jndiName);
}
提示与帮助
如果按照本教程所述进行实际实现,请不要在一台计算机上同时测试两种桥接器。Zend产品将把所有内容放在执行搜索路径中,然后启动服务,这将干扰SourceForge桥接器的运行。
如果需要帮助,可将疑问和评论发布到Dev2Dev PHP新闻组。本教程的测试是在Windows XP环境下进行。这两种桥接器可以在各种版本的Windows和Unix平台上运行;可以查看相应产品的文档以了解它是否支持您的配置。
Zend Platform桥接器
如今,Zend提供的引擎为用户提供了大量PHP支持。其核心引擎是开放源码的,但是Zend提供的桥接器组件是商业产品的一部分,称为Zend Platform。可以点击这里查看关于对Zend Platform Java Bridge的说明。
要使用这种桥接器,必须安装Apache Foundation的HTTP Server (或者在Windows中可使用Microsoft的IIS)。 Zend Platform产品发布的Zend平台安装指南(Zend Platform Installation Guide)提供了完整的安装说明。
图1描述的是运行时配置。桥接器实例化JVM,并向它传递对Java对象进行实例化和操作的请求,包括那些通过JNDI传输的请求。
图1:以Apache为Web服务器运行Java 桥接器
在该配置中:
1.PHP请求到达Apache,并经由Apache传送至PHP引擎。
2.当PHP脚本发出"new Java()"调用时,桥接器将命令传递给经它实例化了的JVM。POJO请求可以在JVM内部执行。
3.此时,可以以正常方式访问VJNDI资源。
有益的提示:
1.桥接器使用的所有的.jar文件必须位于环境类路径中。该桥接器没有类路径配置选项。
2.该桥接器没有像核心PHP引擎那样动态转换数据。必须在PHP代码中输入转换。举例来说,如果调用下面这个Java方法:
public void doSomething(int i);
使用下面的PHP代码进行调用:
$var = "1"
$javaObject->doSomething($var);
Zend桥接器会抛出异常并表明输入参数的类型错误。由于Zend桥接器不能进行隐式转换,可以在传递参数之前使用下面的方法使解释器将字符串强制转换为数值值:
$javaObject->doSomething($var + 0);
SourceForge桥接器
该桥接器是封装了Zend核心引擎的免费的开源产品。配置之后使用与上文演示的Zend Platform桥接器相同的方式进行操作(即作为Apache/PHP配置和Java EE Server的连接)。该桥接器也可在其他的配置中运行:可以将它作为Java servlet部署,如图2所示:
安装SourceForge Java桥接器:
1.从SourceForge site下载一个版本,本教程使用的是php-java-bridge_3.2.1_j2ee.zip。
2.打开压缩文件并提取java-bridge.war文件。
3.把java-bridge.war文件解压到Eclipse工作间的新文件夹。(我们称之为“JavaBridge”)
4.如果希望使用Workshop Studio:
必须使用3.2版本或者更高的版本。可从这里下载。
使用新的Workshop Studio New Project Wizard,在该工作间中创建一个Dynamic Web Project From Existing Source。把Web环境的根目录设置到JavaBridge。
指向存放解压了的.war文件的文件夹。(遗憾的是,WTP目前存在的一个问题使得不能够将.war文件作为项目导入。)
5.使用Studio或者其他工具将应用程序部署到WebLogic Server。
6.将Web浏览器指向http://localhost:7001/Javabridge。index.php将显示几个演示该桥接器的示例程序。
图2:把SourceForge Java Bridge作为PHP servlet运行
在该配置中:
1.收到PHP请求,并由WebLogic Server映射到桥接器的PHP servlet。
2.PHP 脚本传递至php-cgi加以处理。
3.桥接器通过向Java Gateway servlet发出请求,将对Java对象的调用传递到WebLogic Server JVM。
4.此时,可以以正常方式访问JNDI资源。
有益的提示:
在servlet默认配置下,该桥接器为每一个PHP调用提供一个CGI进程,该进程可以在请求完成后终止。在多于一个PHP请求运行的情况下,可能会导致性能问题。桥接器发行版包含配置FastCGI的说明,FastCGI可以维护PHP地址空间并为闲置的地址空间分配分派到来的请求。这种方式避免了为每个请求启动和终止操作系统进程的开销。根据操作系统平台的不同,设置这一功能的难度也有所不同。
示例代码:访问WebLogic Server上的资源
我们提供了使用桥接器功能的示例EJB和PHP客户机程序。该代码可以使用两种桥接器。下载部分提供了PHP 脚本,Trader EJB的ERA,以及客户机jar文件。(EAR文件也包括所有Java类型的源代码。)要运行示例程序:
1.将ejbref.php添加到JavaBridge Web根目录(或添加到之前介绍的SourceForge 桥接器提到的Eclipse项目,或者添加到包含test.php的Zend平台的目录里)。
2.使桥接器可以使用TraderClient.jar:将其添加到Zend桥接器的环境类路径中,或将其添加到为SourceForge桥接器部署的servlet应用程序中的 WEB-INF/lib。
3.将Trader.ear文件部署到 WebLogic目标服务器。
4.将浏览器指向部署了的ejbref.php脚本并运行。
在这个代码示例中可看到ejbref.php的源代码。它加载了一个表单,当用户发回请求时,它使用本文第一个代码示例中使用的方法实例化WebLogic Server上的EJB。
<html><head><title>Buy or Sell shares</title></head>
<body>
<?php
if (isSet($_POST['ticker'])) {
$trader = getBean();
if (isSet($_POST['buy'])) {
$result = $trader->buy($_POST['ticker'], ($_POST['shares'] + 0) );
$action = 'bought';
}
else {
$result = $trader->sell($_POST['ticker'], $_POST['shares'] + 0);
$action = 'sold';
}
$trader->remove();
print <<<__HTML__
<i>{$result->getNumberTraded()} shares of {$result->getStockSymbol()} $action.</i>
__HTML__;
}
else {
print <<<__HTML__
<form action="http://localhost:7001/Java桥接/ejbref.php" method="post">
Ticker Symbol: <input type="text" size="4" name="ticker"/><p>
Number of Shares: <input type="text" size="6" name="shares"/><p>
<input type="submit" name="buy" value="buy"/> <input type="submit" name="sell" value="sell"/>
__HTML__;
}
function getBean() {
$envt = array(
"java.naming.factory.initial" => "weblogic.jndi.WLInitialContextFactory",
"java.naming.provider.url" => "t3://localhost:7001"
);
$ctx = new Java('javax.naming.InitialContext', $envt);
$home = $ctx->lookup('TraderHome');
return $home->create();
}
?>
</body>
</html>
工具
两个可用的工具分别是Zend Studio,一种商业产品,还有Eclipse PHP Development Tools (PDT)。可以从Zend Eclipse更新站点http://www.zend.com/pdt下载Eclipse PDT的稳定版本。(还可以从Eclipse PDT Project上直接下载新版本。)Workshop Studio release 3.2版本或更高版本可能已经安装了PDT,(但Workshop for WebLogic还不支持该功能)。PDT提供PHP编辑工具(代码着色,自动完成,语法错误检查),Workshop Studio能帮助您将SourceForge PHP Servlet配置部署到WebLogic Server。
Zend Studio调试器(商业产品)可以与Zend Platform桥接器很好地工作。与SourceForge桥接器一起发布的PHP核心引擎没有安装服务器端的调试器。因此它不能立即与Zend Studio一起使用。关于这一点,Eclipse调试器还是一个有待改进的产品。在撰写本文时,还无法将它用于任何一种桥接器。
结束语
本教程介绍了PHP-Java桥接器的设置方法,也充分演示了创建和管理这种配置所涉及到的复杂性。我们将继续探寻PHP与位于JVM上的Java的集成。对于希望在自己的应用程序中组合这两种语言的开发人员来说,我们相信这项研究将使他们的工作更加轻松。可访问我的博客了解未来规划。