结合使用 PHP-Java 桥接器和 WebLogic Server

作者:Gary Horen
02/13/2007

摘要

PHP 是很流行的脚本语言。而 BEA WebLogic Server 是专门为 Java 构建的应用服务器。如何才能同时使用这两种技术并从 PHP 和 Java 中受益呢?PHP-Java 桥接器是方法之一。本教程将详细说明如何设置和使用两种不同的桥接器产品,从而将 PHP 和 Java 应用程序代码结合起来。

简介:什么是 PHP-Java 桥接器?

和 WebLogic Server 一起使用的 PHP 引擎(支持 PHP 语言的核心解释器)可用的实现都是本地代码。例如,引擎在它自己的操作系统进程中运行,还必须和 Web 应用程序中其他进程(如 Web 服务器或者 Java 应用服务器)以某种方式进行通信。就 Java 服务器而言,可以使用某种技术将通信过程非常透明地呈现给应用程序编程人员。有这样一种组件,它在两种环境之间不断地编组数据,并且提供了应用程序开发人员可以用来集成两种语言的 PHP 语言构造器。这种组件就是 PHP-Java 桥接器。

为什么要使用桥接器?

能够激发所有人的一个例子就是在同一个应用程序中结合使用 Java 和 PHP,下面几种方法可以实现以下目的:

  • PHP 代码可以实例化并调用 Java 对象的方法,可以是 POJO 或者像 EJB 这样的 Java EE 资源。
  • 可以使用 WebLogic Server 作为 Web 服务器用于使用 PHP 编码的页面。
  • Java 代码可以调用 PHP 脚本。

下面介绍了头两种情况。以后会讨论第三种。

可用的实现

当前有两种桥接器可以使用,并且都能够与 WebLogic Server 协同运作。一个是来自 Zend Technologies Ltd. 的商业产品。另外一个是开源组件,得到 LGPL 许可,可从 SourceForge 获得。(还有第三种实现,位于 php.net,但是这种产品已经被淘汰,因为它不能支持 PHP 的最新版本,因此本教程将不对其进行讨论。)

这两种桥接器都允许 PHP 与 WebLogic Server 上的传统 Java 对象 (POJO) 和 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 bridge 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 平台安装指南 提供了完整的安装说明。

图 1 描述的是运行时配置。桥接器实例化 JVM,并向它传递对 Java 对象进行实例化和操作的请求,包括那些通过 JNDI 传输的请求。

使用 Apache
图 1. 以 Apache 为 Web 服务器运行 Java 桥接器

在该配置中:

  1. PHP 请求到达 Apache,并经由 Apache 传送至 PHP 引擎。
  2. 当 PHP 脚本发出“new Java()”调用时,桥接器将命令传递给经它实例化了的 JVM。POJO 请求可以在 JVM 内部执行。
  3. 此时,可以以正常方式访问 JNDI 资源。

有益的提示:

  • 桥接器使用的所有的 .jar 文件必须位于环境类路径中。该桥接器没有类路径配置选项。

  • 该桥接器不会像核心 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 站点下载一个版本。本教程使用的是 php-java-bridge_3.2.1_j2ee.zip。
  2. 打开 zip 文件并提取 JavaBridge.war。
  3. 把 JavaBridge.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 将显示 几个演示该桥接器的示例程序。

Servlet
图 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/JavaBridge/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 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 的集成。对于希望在自己的应用程序中组合这两种语言的开发人员来说,我们相信这项研究将使他们的工作更加轻松。可访问我的网志了解未来规划。

参考资料

Gary Horen 是 BEA Workshop 小组的 Ajax and Languages 项目经理