首页 理论教育PHPMVC开发实战教程

PHPMVC开发实战教程

【摘要】:图12-2 SOAP服务如果服务没有开启,需要在PHP配置文件中开启,如以下代码所示。其中参数1表示SOA服务描述文件,即WSDL文件,该文件是SOAP通信的核心;参数2表示SOAP协议版本,常用的版本有1.0及1.2,本章内容及示例全部基于SOAP 1.2版本实现。使用普通的Firebug等插件不能获取到异常信息,而断点调试是PHP的弱项,所以调试问题将会是SOAP开发首要面对的问题。

PHP 5以插件的形式提供SOAP服务,所以在编译时,需要加入--enable-soap选项。使用phpinfo输出信息时,如果存在SOAP选项,表示服务已经生效,如图12-2所示。

978-7-111-42852-7-Part02-676.jpg

图12-2 SOAP服务

如果服务没有开启,需要在PHP配置文件中开启,如以下代码所示。

978-7-111-42852-7-Part02-677.jpg

在Linux操作平台开启SOAP服务的代码如下所示。

978-7-111-42852-7-Part02-678.jpg

SOAP有自己的配置选项,如以下代码所示。

978-7-111-42852-7-Part02-679.jpg

其中选项soap.wsdl_cache_enabled表示是否关闭WSDL数据缓存,值为1时禁用缓存,为了方便程序调试,在开发阶段建议将该项设置为1;soap.wsdl_cache_dir表示缓存存放目录,Windows系统可以设置为c:\tmp;soap.wsdl_cache_ttl表示缓存生命周期,以秒为单位,默认86400;soap.wsdl_cache_limit表示缓存数据大小,以MB为单位。

配置文件修改后,重启PHP服务或者php-fpm,即可生效。如果PHP运行于非安全模式下,上述配置项可以直接在PHP代码中使用ini_set设置,例如关闭WSDL缓存功能,如以下代码所示。

978-7-111-42852-7-Part02-680.jpg

前面提到过PHP既可以作为SOAP的客户端,也可以作为服务端。作为服务端时,使用SoapServer实例类初始化SOAP服务,如以下代码所示。

978-7-111-42852-7-Part02-681.jpg

其中参数1表示SOA服务描述文件,即WSDL文件,该文件是SOAP通信的核心;参数2表示SOAP协议版本,常用的版本有1.0及1.2,本章内容及示例全部基于SOAP 1.2版本实现。(www.chuimin.cn)

得到SoapServer实例对象,就可以调用对象中的setClass方法设置WSDL所描述的消息服务。通常情况下,需要将setClass指定实例类描述为可公开调用的服务接口。假设需要将User类描述为WSDL服务接口,代码如下所示。

978-7-111-42852-7-Part02-682.jpg

user.php类文件如以下代码所示。

978-7-111-42852-7-Part02-683.jpg

所有作为公开调用的服务接口,成员类方法必须修饰为public权限。

当PHP作为客户端模式时,使用SoapClient实例类。假设需要调用前面创建的user服务,代码如下所示。

978-7-111-42852-7-Part02-684.jpg

978-7-111-42852-7-Part02-685.jpg

在实际应用开发时,WSDL文件可以是远程的文件,并且支持跨域访问。可以看到,PHP在调用SOAP服务时,开发人员不需要编写任何处理WSDL或者XML文档的过程,只需要像本地开发一样调用对象中的方法即可。

看到这相信读者已经感觉到分布式开发无论是客户端还是服务端,PHP所需要做的工作非常少。关键是WSDL文档模型,这里并没有涉及相关内容,是因为WSDL确实是分布式开发中最重要的文档模型,读者只有彻底理解该文档模型,才能正确开发分布式应用,所以接下来的内容将重点围绕该文档展开。

虽然SOAP开发具有很多优点,但并非没有缺点,在实际开发中应该根据需要考虑是否该使用SOAP代替XML或者Json,存在的缺点主要如下。

➢在PHP中内置的SOAP扩展并不支持生成生成SOA服务,开发人员需要手动创建WSDL文件,而Json或XML等,PHP直接提供生成及解释功能。

➢WSDL文件虽然是SGML文件,但需要使用SOAP协议访问,如果使用普通的浏览器访问WSDL文件,将不能触发相应服务。这就意味着在开发阶段要进行调试,过程将变得复杂。使用普通的Firebug等插件不能获取到异常信息,而断点调试是PHP的弱项,所以调试问题将会是SOAP开发首要面对的问题。

➢能不能使用SOAP,关键是看解释引擎支不支持SOAP协议及SOA服务。虽然主流的技术,例如Object-c、C#、C++、Java等都提供了良好的支持,但常见的JavaScript并不支持SOAP。