j2ee|php5|web|web服务|程序|访问
很多 Web 开发人员喜欢 PHP 的丰富功能和简单易用,但有时候他们需要访问 J2EE 应用程序服务器中已有的业务逻辑。本文将通过一些例子说明如何通过 PHP 5 中新的 SOAP 扩展使用 Web 服务来访问 J2EE 应用程序,而不必脱离 PHP 环境,也不用学习新的编程模型。
PHP、Web 服务和 SOAP 简介
本文将介绍如何从 PHP 脚本中访问企业应用程序。您可能是一位 PHP 程序员,需要为部门 Web 应用程序编写代码,以便访问公司总部以 Web 服务方式提供的服务。您或许是一位有经验的 J2EE 开发人员,希望多了解一点 PHP 及其应用。本文中的例子是一个运行在 IBM WebSphere? 应用程序服务器上的 Enterprise JavaBean(EJB),但本文并没有讨论 Web 服务的部署。它的主要目标是介绍如何从 PHP 中使用 Web 服务,这一点可以应用于各种 Web 服务实现。
什么是 PHP?
PHP:Hypertext Preprocessor(超文本预处理器,PHP)是一种流行的服务器端脚本语言,用于创建动态 Web 内容。PHP 解释器为主流平台提供了源代码或者编译好的二进制文件,这些平台包括大多数 Linux? 版本、Windows?、Mac OS X 和 iSeries?。
确实有数百万台 Web 服务器正在运行 PHP,其中大部分使用的是 PHP 4。2004 年 7 月推出的 PHP 5 正在逐渐被采用。PHP 5 改进了对象模型,底层的内存管理也从多线程和性能的角度重新作了设计。但是需要注意少数无法向后兼容的修改,PHP 手册中对这些进行了记录。
什么是 Web 服务技术?
Web 服务指的是自成体系的、模块化的应用程序,客户机和服务在这种应用程序中是松耦合的。关于 Web 服务的详细信息,对于本文来说,您只需要了解其中的主要技术:
SOAP(简单对象访问协议)定义了客户机与服务器之间传递的消息。消息采用 XML 格式。SOAP 独立于平台、编程语言、网络和传输层。本文将讨论 HTTP 上的 SOAP。
WSDL(Web 服务描述语言)是用于描述 Web 服务的基于 XML 的语言,描述内容包括服务的位置、格式、操作、参数和数据类型。
UDDI(统一描述、发现和集成)是用 API 和 UDDI Registry 实现来提供在网络上存储和检索 Web 服务信息的方法。
本文包括 SOAP 消息和 WSDL 文档的一些例子,但没有提供 UDDI 的例子。
XMethods 网站是一个有用的 Web 服务工具,在那里可以找到在各种服务器平台上实现的可公开使用的 Web 服务的列表。可以使用本文中的例子很方便地访问从 XMethods 中选择的服务。
SOAP 和 PHP
有多种产品允许在 PHP 4 脚本中使用 SOAP,最常见的产品是 PEAR::SOAP 和 NuSOAP。在写这篇文章的时候,这些产品在与 PHP 5 的兼容方面还存在问题,估计很快就会升级。
PHP 5 中新增了内置的 SOAP 扩展,我们称之为 ext/soap。它是作为 PHP 的一部分提供的,因此不需要下载、安装和管理单独的包。这是第一个用 C 而不是 PHP 为 PHP 编写的 SOAP 实现,因此作者声称它的速度要快得多。
因为新的扩展是 PHP 的完整组成部分之一,相关文档包含在 PHP 手册的 Function Reference 部分。SOAP 参考是以一个重要的免责声明开始的:
警告:该扩展是试验性的(EXPERIMENTAL)。本扩展的行为,包括关于本扩展的函数名和其他内容,在以后的 PHP 版本中随时可能改变,不另行通知。使用该扩展的风险自负。
警告看起来有点让人担心,但实际上这个扩展似乎得到了很好的支持。和任何新代码一样,该扩展也存在缺陷,但是报告的问题通常很快就能得到修正。在 PHP 站点上可以看到缺陷列表。我们估计,在将来的 PHP 版本中,该扩展将从试验性功能转为主流功能。
安装 PHP SOAP 扩展
应该在 Web 服务器上安装并运行 PHP 5。我们的实验采用 PHP 5.0.2,这是现在最新的版本,修正了 PHP 5 初始版本中的很多错误。上面已经提到,ext/soap 是作为 PHP 5 的一部分提供的,因此不需要单独下载,但是您可能需要对它做一些修改来启用它。需要做哪些修改则取决于您是下载源代码,自己编译 PHP,还是直接下载二进制文件。
如果下载的是 PHP 源代码,并在自己的平台上编译,那么可能需要重新进行构建,因为在默认情况下没有启用 ext/soap。重复以前的构建过程,并在 configure 命令中添加 --enable-soap 选项。
如果下载的是预编译平台的二进制文件,ext/soap 可能已经编译但没有加载,因此需要更新 PHP 配置,以便加载 ext/soap。编辑 php.ini 并找到 Dynamic Extensions 部分,在这里增加一行代码来自动加载该扩展。
在 Windows 上,这一代码行是:
extension=php_soap.dll
在 UNIX 上是:
extension=php_soap.so
如果以前没有加载过任何可选的扩展,可能还要设置 extension_dir 指令,让它指向包含扩展库(其中包括 php_soap)的目录,比如:
extension_dir="C:/php/ext/"(在 Windows 上使用正斜杠)
不要将目录信息放到 extension 指令中,需要的话可以使用 extension_dir。
对于 Windows,可以下载其他两个二进制包。Windows 安装程序包不含任何扩展,因此要使用 Windows zip 压缩包,这个压缩包中包含 ext/soap。
注意,ext/soap 依赖于 GNOME xml 库,这个库必须使用 2.5.4 或更高版本。如果版本不够高,可以从 xmlsoft安装 libxml2。
最后,ext/soap 在 php.ini 中有自己的配置部分,在完成配置之后,ext/soap 如下所示:
[soap]
; Enables or disables WSDL caching feature.
soap.wsdl_cache_enabled=1
; Sets the directory name where SOAP extension will put cache files.
soap.wsdl_cache_dir="/tmp"
; (time to live) Sets the number of second while cached file will be used
; instead of original one.
soap.wsdl_cache_ttl=86400
这段配置控制了 SOAP 扩展的 WSDL 缓存特性。默认情况下,WSDL 描述文件在 24 小时(86400 秒)内都缓存在 /tmp 目录下。我们迟些时候再讨论这些内容,现在要设置 soap.wsdl_cache_enabled=0,否则,在开发代码时,您会遇到一些莫名其妙的行为。完成开发之后,要记得打开 WSDL 缓存,使代码运行得更快。
为了便于参考,我们将在两种环境中使用 ext/soap:
Linux Centos 3.3(Red Hat EL 3 的免费重建版本)、Apache 2.0.47、PHP 5.0.2,需要升级 libxml2 到 2.6.12。
Windows XP SP1、Apache 2.0.46、PHP 5.0.2 二进制压缩包、libxml2 2.6.11。
这些说明同样适用于其他配置。
Weather Forecast 应用程序
我们要从 PHP 中访问的 Web 服务是一个天气预报应用程序。这是 WebSphere Version 5.1 Application Developer 5.1.1 Web Services Handbook 中开发的示例应用程序。下载示例 Weather Forecast 应用程序,请参阅本文后面的下载部分。这本书设计了几种不同的场景,但我们只考虑一种,在该书中,这种场景称为“自下而上的开发,使用 HTTP 传输和 SOAP 消息从会话 EJB 生成 Web 服务”。在这里,自下而上的意思是说,Web 服务是围绕现有企业应用程序进行包装的。
图 1. 天气预报应用程序
图 1 中标出的 Weather Forecast 应用程序的主要组成包括:
预测天气的后台 WEATHER 数据库。天气预报中的信息包括:
风向,八个方位
风速,公里/小时
气温,摄氏度
天气状况:晴、有时阴、阴、雨、暴雨
日期
WeatherPredictor 类用于访问 WEATHER 数据库。如果数据库中没有适用于请求日期的预报,那么 WeatherPredictor 会随机生成天气预测(与实际的天气预报不同),并将它保存到数据库中。
业务逻辑由 WeatherForecastEJB 会话 bean 提供,并公开为 Web 服务,它提供三项操作:
getDayForecast 返回某一天的天气预报。
getForecast 返回某个时期的天气预报。
getTemperatures 返回某个时期的气温预测。
将这个会话 bean 部署为 Web 服务所需的所有元素都是由 WebSphere Studio Application Developer 的 Web 服务向导生成的,并且是作为 ItsoWebService2RouterWeb 项目生成的。路由器 servlet 是连接 SOAP 消息和 EJB 容器的桥梁,需要配置和部署路由器 servlet,通过 URL ItsoWebService2EJBRouterWeb/services/WeatherServiceEJB 来使 Weather 服务可用。WSDL 文档 itso.session.WeatherForecastEJB.wsdl 在 ItsoWebService2EJBRouterWeb/wsdl 目录中。
Java 客户机是这本书中开发的多个 Weather Service 客户机之一。ItsoWebService2EJBClient 项目中的 WeatherClientEJB 是一个简单的 Java servlet,调用 getForecast Web 服务操作。典型的运行结果如下所示:
图 2. Java WeatherClient
下一步是在 PHP 中建立等价的客户机功能。
阅读本文不需要自己运行这个例子,可以针对从 XMethods 网站选择的服务建立 PHP 客户机。