许多机构已经采用了Apach和PHP作为他们的Web应用环境。在Web services模式中采用PHP可能看上去可能会比较难。但是事实上,你可以轻松的应用PHP5.0构建SOAP的客户端和服务器端。
什么是 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 扩展
在 Windows 上,只要在;extension=php_zip.dll这行后面增加extension=php_soap.dll 这样一行就行了
最后,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="D:/WEB/php/soap_temp"
; (time to live) Sets the number of second while cached file will be used
; instead of original one.
soap.wsdl_cache_ttl=86400
一个例子便能说明一切,让我们先看一个例子为了说明如何应用PHP5.0来构建Web services,我们将举一个简单的例子。这个例子应用程序由一个PHP Web services的服务器端和客户端组成。他将实现两个功能:颠倒一个字符串字符的顺序,求两个数的和
PHP SOAP服务器用PHP5.0来建立SOAP服务器非常容易。基本上,你只要写出你想要暴露给你的Web services的函数,然后去注册它们就可以了。
OK,另外还需要两步才能完成PHP SOAP服务器的建立。首先你还要在你的PHP代码中创建Soap对象的一个实例,然后用HTTP POST方法将原始数据传给Soap进行处理。听起来简单吧。
先看看清单1
soapfunc.php
//soapfunc.php
function reverse($str){
$retval = "";
if(strlen($str) < 1) {
return new SoapFault(''Client'','''',''Invalid string''); // it is possible to use PHP exception mechanism to throw SOAP Fault
}
for ($i = 1; $i <= strlen($str); $i++) {
$retval .= $str[(strlen($str) - $i)];
}
return $retval;
}
function add2numbers($num1, $num2) {
if (trim($num1) != intval($num1)) {
return new SoapFault(''Client'', '''', ''The first number is invalid'');
}
if (trim($num2) != intval($num2)) {
return new SoapFault(''Client'', '''', ''The second number is invalid'');
}
return ($num1 + $num2);
}
?>
清单1给出了soapfunc.php的源文件。这个文件包含了我们想通过SOAP协议暴露给Web services的两个函数:reverse和add2numbers,它们是我们这个Web services 应用的核心。函数reverse带一个参数,颠倒字符串中的字符的顺序,然后返回
清单2:soapserver.php
//soapserver.php
include_once(''soapfunc.php'');
$server = new SoapServer(null, array(''uri'' => "http://test-uri/"));//the creation of SoapServer objects in WSDL or non-WSDL mode
$server->addFunction(''reverse'');//Exports one or more functions for remote clients
$server->addFunction(''add2numbers'');//Exports one or more functions for remote clients
$server->handle();//Processes a soap request, calls necessary functions, and sends a response back. The soap request. If this argument is omitted, the request is supposed to be in the $HTTP_RAW_POST_DATA PHP variable.
?>
清单2举例说明了addFunction函数和调用SOAP处理程序的用法。你看到了,注册你的两个函数(在soapfunc.php中)、传递POST数据给SoapServer对象,就跟创建一个新的SoapServer对象实例一样的简单。SoapServer对象将要检查POST数据并确定将调用哪个函数,然后向这个PHP函数传递参数。从PHP函数返回的数据被重新包装为SOAP响应并传送给请求服务的SOAP客户端。
PHP SOAP客户端现在我们已经利用PHP5.0创建了一个SOAP服务器,我们需要对它进行测试。像我们建立SOAP服务器程序一样,我们可以在PHP中再建立一个SOAP的客户端程序。清单3给出了PHP SOAP客户端程序的源程序。
现在我们已经利用PHP5.0创建了一个SOAP服务器,我们需要对它进行测试。像我们建立SOAP服务器程序一样,我们可以再建立一个SOAP的客户端程序。清单3给出了PHP SOAP客户端程序的源程序。
清单3:soapclient.php
//include(''nusoap.php'');
$client = new SoapClient(null, array(''location'' => "http://test.dev.asp/soapserver.php",
''uri'' => "http://test-uri/"));
$str = "This string will be reversed";
$params1 = array(''str''=>$str);
$reversed = $client->__soapCall(''reverse'',$params1);
echo "If you reverse ''$str'', you get ''$reversed''
n";
$n1 = 5;
$n2 = 14;
$params2 = array(''num1''=>$n1, ''num2''=>$n2);
$added = $client->__soapCall(''add2numbers'', $params2);
echo "If you add $n1 and $n2 you get $added
n";
?>
为了在一个SOAP服务器上能使用PHP客户端程序,你还得做三件事情。第一,你要创建一个SoapClient对象。SoapClient对象负责处理参数的编组和SOAP协议。SoapClient需要一个必须是URL的参数。这个URL可以指向一个实际SOAP服务器的HTTP终端或者一个WSDL描述。在我们这个例子里,它是指向我们的PHP SOAP服务器的一个URL。
当调用需要参数的函数时,你需要先创建一个参数数组,数组包括一组键-值(key-value)对。键(key)是参数的名字,值(value)是参数的值。
当需要调用函数时,你就用SoapClient对象去调用函数__soapCall,并且传入两个参数。第一个参数是你要调用的函数的名字,第二个参数是包含SOAP函数所带参数的一个数组,主调函数将会返回你调用的SOAP函数的值。
要运行这个例子,只要简单的在Web浏览器中输入soapclient.php的URL。你将类似以下的输出:
If you reverse ''This string will be reversed'', you get ''desrever eb lliw gnirts sihT'' If you add 5 and 14 you get 19
如果对函数不懂的话,可以去查阅php5.0的手册。本文在php5.0编译通过。有关使用WSDL描述的使用正在学习中。