544
人物
PHP_SOAP_扩展_PHP SOAP 扩展详解
PHP SOAP 扩展[kuo zhan]
SOAP 的全称为简单对象[dui xiang][dan dui xiang]访问协议[xie yi] (Simple Object Access Protocol)。它是一种基于 XML 的,可扩展[kuo zhan]的[ke kuo zhan de]通信[tong xin]协议[xie yi][tong xin xie yi]。SOAP 提供了一种标准,使得运行[yun hang]在不同 平台[ping tai] 上并使用不同的编程[bian cheng] 语言[yu yan] 编写的 应用[ying yong] 程序 可以互相进行通信[tong xin]。SOAP 的可扩展[kuo zhan]性[ke kuo zhan xing]和平台[ping tai]无关性使得它被广泛用作 Web 服务 的通信[tong xin]协议[xie yi][tong xin xie yi]。
由于 java 语言[yu yan]提供了对 SOAP 的良好支持[zhi chi],通常基于 Web 服务的应用[ying yong]程序[ying yong cheng xu]使用 Java 语言[yu yan]编写。对于广大的 PHP 程序员[cheng xu yuan]来说,可能会有一点小小的不满 – PHP 的较早版本根本没有对 SOAP 的直接支持[zhi chi],只能通过 PEAR(the PHP Extension and Application Repository) 中的 SOAP 库或者第三方[di san fang]产品 NuSOAP 来 开发 Web 服务。不过最近的版本已经改变了这一状况。自 PHP 5 开始新增了内置的 SOAP 扩展[kuo zhan] (ext/soap),从此我们不需要下载[xia zai]额外的扩展[kuo zhan]库或是 代码[dai ma] 包来开发基于 SOAP 的应用[ying yong]程序[ying yong cheng xu]了。接下来让我们来看看 SOAP 扩展[kuo zhan]中都有哪些内容。
PHP 5 中的 SOAP 扩展[kuo zhan] (ext/soap) PHP 5 最早发布的版本 5.0.0 中就已经提供了 SOAP 扩展[kuo zhan],不过当时的 PHP 手册中声明[sheng ming]这个扩展[kuo zhan]是试验性 (experimental) 的。实际上当时的版本已经实现了比较完善的 功能 ,也没有必要为此而担心。目前这个扩展[kuo zhan]还在不断地完善,早期版本中的大部分 bug 都已经得到了修正,目前最新的版本 (5.3.0) 中已经提供了比较完整的对 SOAP 的支持[zhi chi],而且我们有理由相信[xiang xin],以后的版本还会更好。
SOAP 扩展[kuo zhan]库结构[jie gou]
ext/soap 中包括六个预定义的类,通过这些类,我们可以创建 Web 服务端 (SoapServer 类 ),客户[ke hu]端 (SoapClient 类 ),处理 SOAP 请求[qing qiu]和应答[ying da] (SoapHeader, SoapParam, SoapVar 类 ),诊断[zhen duan]错误[cuo wu] (SoapFault 类 )。这些类之间的联系[lian xi]如图 1 所示:
图 1. SOAP 扩展[kuo zhan]的结构[jie gou]
SOAP 服务类 SoapServer
SoapServer 类用来开发 Web 服务端应用[ying yong]程序[ying yong cheng xu]。这个类中包含创建,设置[she zhi]和操纵 Web 服务的 函数[han shu] 。有两种方式可以向 Web 服务中添加操作 (Operation)。一种方式是直接添加已定义的函数[han shu],另一种方式是添加已定义好的类,从而将该类的公有成员[gong you cheng yuan]函数[han shu]添加到 Web 服务中。
另一个需要说明[shuo ming]的特性是,PHP 支持[zhi chi]两种 Web 服务的 模式[mo shi] :WSDL 模式[mo shi]和 non-WSDL 模式[mo shi],为了便于理解,我们首先从 Web 服务的两种实现模式[mo shi]开始说起。
PHP 中 Web 服务的两种模式[mo shi]:WSDL 模式[mo shi]和 non-WSDL 模式[mo shi]
对于 Web 服务来说,主要有两种实现模式[mo shi] – 契约先行 (Contract First) 模式[mo shi]和代码[dai ma]先行 (Code Fist) 模式[mo shi]。
契约先行模式[mo shi]的实现中,首要工作是定义针对这个 Web 服务的借口的 WSDL(Web Services Description Language,Web 服务描述语言[yu yan] ) 文件[wen jian] 。WSDL 文件[wen jian]中描述了 Web 服务的位置[wei zhi],可提供的操作集,以及其他一些属性[shu xing]。WSDL 文件[wen jian]也就是 Web 服务的“契约”。“契约”订立之后,再据此进行服务器[fu wu qi]端和客户[ke hu]端的应用[ying yong]程序[ying yong cheng xu]开发。这种模式[mo shi]对应上节所说的 WSDL 模式[mo shi]。我们后文中介绍的例子就是使用这一模式[mo shi]实现的。
与契约先行模式[mo shi]不同,代码[dai ma]先行模式[mo shi]中,第一步工作是实现 Web 服务端,然后根据服务端的实现,用某种方法[fang fa](自动生成或手工编写)生成 WSDL 文件[wen jian]。但是由于 PHP 本身并没有提供从 Web 服务实现代码[dai ma]中生成 WSDL 文件[wen jian]的方法[fang fa],因此就要以 non-WSDL 模式[mo shi]连接[lian jie]服务端,即不通过 WSDL 文件[wen jian]创建[wen jian chuang jian] SoapServer 和 SoapClient 示例,而是直接向构造函数[han shu][gou zao han shu]传递必要的参数[can shu]。当然,代码[dai ma]先行模式[mo shi]也有其他的解决方法[fang fa],一些集成[ji cheng]的 PHP 开发 工具 (如 Zend Studio)就提供了根据 Web 服务实现代码[dai ma]生成[dai ma sheng cheng] WSDL 文件[wen jian]的功能。
SOAP 客户[ke hu]端类 SoapClient
SOAP 客户[ke hu]端类 SoapClient 用于[yong yu]开发 Web 服务的客户[ke hu]端程序。可用的成员函数[han shu][cheng yuan han shu]主要有创建客户[ke hu]端实例,调用[tiao yong]可用操作,查询可用操作和数据[shu ju]类型[lei xing][shu ju lei xing]等。除此之外还包括了可用于[yong yu]程序调试[tiao shi]的函数[han shu] – 获取上次请求[qing qiu]和应答[ying da]的 SOAP 数据[shu ju]。
SOAP 参数[can shu]类 SoapHeader, SoapParam, SoapVar
SoapParam 和 SoapVar 主要用来封装[feng zhuang]用于[yong yu]放入 SOAP 请求[qing qiu]中的数据[shu ju],他们主要在 non-WSDL 模式[mo shi]下使用。事实上,在 WSDL 模式[mo shi]下,SOAP 请求[qing qiu]的参数[can shu]可以通过数组[shu zu]方式包装,SOAP 扩展[kuo zhan]会根据 WSDL 文件[wen jian]将这个数组[shu zu]转化成为 SOAP 请求[qing qiu]中的数据[shu ju]部分,所以并不需要这两个类。而在 non-WSDL 模式[mo shi]下,由于没有提供 WSDL 文件[wen jian],所以必须通过这两个类进行包装。
SoapHeader 类用来构造 SOAP 头,SOAP 头可以对 SOAP 的能力[neng li]进行必要的扩展[kuo zhan]。SOAP 头的一个主要作用[zuo yong]就是用于[yong yu]简单的身份[shen fen]认证[ren zheng],后面会有例子说明[shuo ming]这一点。
SOAP 异常[yi chang]类 SoapFault
这个类从 PHP 的 Exception 类继承[ji cheng]而来,可以用来实现 SOAP 中的异常[yi chang]处理[yi chang chu li]机制[ji zhi],由 SOAP 服务端抛出[pao chu]。SOAP 客户[ke hu]端可以接收该类的实例,用于[yong yu]获取有用的调试[tiao shi]信息[xin xi]。
安装[an zhuang] SOAP 扩展[kuo zhan] 为了使用 SOAP 扩展[kuo zhan],我们就需要在 Web 服务器[fu wu qi]上安装[an zhuang]它。这里有几个因素需要考虑。 安装[an zhuang]的前置条件[tiao jian][qian zhi tiao jian]:在官方的使用手册中可以找到,ext/soap 扩展[kuo zhan]使用了 GNOME XML 库,因此在安装[an zhuang] SOAP 扩展[kuo zhan]之前需要安装[an zhuang]这个库(需要 2.5.4 以上版本)。 PHP 是否已安装[an zhuang]: 如果你想在安装[an zhuang] PHP 的同时加入 SOAP 扩展[kuo zhan],那再简单不过了。如果是下载[xia zai] PHP 源代码[dai ma][yuan dai ma]自己编译[bian yi]安装[an zhuang]的情况[qing kuang],则只需要在编译[bian yi]时[bian yi shi]的 configure 命令[ming ling]中添加选项[xuan xiang] –enable-soap 即可。如果是直接使用二进制[er jin zhi]文件[wen jian][er jin zhi wen jian]安装[an zhuang](通常只用于[yong yu] Windows 平台[ping tai]),安装[an zhuang]包中则已经包括了这一扩展[kuo zhan],不需要额外安装[an zhuang]。 而如果需要在已经安装[an zhuang]好的 PHP 上添加 SOAP 扩展[kuo zhan],需要做的工作就要多一些。在编译[bian yi] SOAP 扩展[kuo zhan]的源代码[dai ma][yuan dai ma]之前需要使用 phpize 命令[ming ling]设置[she zhi]编译[bian yi]环境,然后再使用 configure 命令[ming ling],之后编译[bian yi]并安装[an zhuang] SOAP 扩展[kuo zhan]。
编译[bian yi]安装[an zhuang] SOAP 扩展[kuo zhan]之后,我们还需要修改[xiu gai] PHP 的配置[pei zhi]文件[wen jian][pei zhi wen jian],以便 SOAP 扩展[kuo zhan]可以正确的被 PHP 加载。对于 Linux 平台[ping tai]来说,需要在 php.ini 中加入如下代码[dai ma]:
extension = php_soap.so [/pre]
而对于 Windows 平台[ping tai],需要加入的代码[dai ma]为:
extension = php_soap.dll [/pre]
除此之外,可能还需要设置[she zhi]扩展[kuo zhan]库的位置[wei zhi],这一信息[xin xi]在 php.ini 的 extension_dir 域中保存,例如:
extension_dir = “/usr/local/php/lib/”[/pre]
上面的工作完成之后,还需要注意的是 SOAP 扩展[kuo zhan]在配置[pei zhi]文件[wen jian][pei zhi wen jian]中有独立[du li]的代码[dai ma]段:
清单 1.php.ini 中 SOAP 扩展[kuo zhan]的设置[she zhi]
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=”C:\xampp\tmp”; (time to live) Sets the number of second while cached file will be used; instead of original one.soap.wsdl_cache_ttl=86400
文章来源于网络
最后更新:2017-01-04 22:34:58