php通过SoapClient调用webservice接口以及注意项 发表于 2018-06-21 | 分类于 Php 一、安装soap扩展1234567891011121314151617181920211、Linux下安装soap模块 查看soap模块是否安装的办法:在php的安装目录下运行php -m来查看 $phppath/bin/php -m | grep soap 如果没有安装,则进入php的安装源文件夹 cd php-$version/ext/soap // 进入文件夹后执行 $phppath/bin/phpize 然后安装编译 make & make install 安装好之后会提示soap.so文件的保存路径 接着修改php.ini文件 ;extension=soap.so 去掉前面的; 重启apache或者php-fpm service httpd restart 或者 /etc/init.d/php-fpm restart 二、客户端调用示例代码1、无SoapHeader认证的情况 12345678 try{ $client = new SoapClient('http://www.whatever.com/WebService.asmx?wsdl'); $result = $client->toDo($paramArr); $result = simplexml_load_string($result->toDoResult); $state = $result->smsstate;}catch (SoapFault $fault){}echo $state; 2、有SoapHeader验证的情况 1234567891011121314151617181920 $soap = new \SoapClient('http://www.whatever.com/WebService.asmx?wsdl');/* *SoapHeader参数说明如下所示: *'http://tempuri.org/' namespace(命名空间可省略 根据服务端定) *'MySoapHeader' SoapHeader头的类名 *'array(...)' 存放标识身份的字符串参数 *'true' 是否必须处理该header*/$head = new \SoapHeader(http://tempuri.org/', 'MySoapHeader', array('uname'=>'admin','pwd'=>'123456'), true);//添加soapheader$soap->__setSoapHeaders($head);//调取需要的webservice方法$res = $s->toDo(array('param'=>'val'));echo $res->toDoResult; 三、参数值传输接收不到的情况123456789101112131415161718192021222324第一次传递的参数,在服务端接收参数正常,修改参数名后,给参数赋值,在服务端出现接收不到参数值的现象调试1:安装soapui,发起调用 -> 调用正常 判断:排除服务器端问题调试2:将参数值修改为固定字符串值,再发起调用 -> 依然接收不到 判断:排除参数赋值失效调试3:改变参数位置,再发起调用 -> 依然接收不到 判断:排除参数位置影响调试4:删除runtime缓存文件,再发起调用 -> 依然接收不到 判断:排除程序缓存文件影响调试5:重启apache或php-fpm,再发起调用 -> 依然接收不到 判断:排除web服务器环境问题调试6:本地wamp环境,发起调用 -> 接收正常 判断:soap环境差异问题导致,查找到是soap缓存的问题修改代码$soap = new \SoapClient('http://www.whatever.com/WebService.asmx?wsdl');为$soap = new \SoapClient('http://www.whatever.com/WebService.asmx?wsdl', array('cache_wsdl' => 0));发起调用 -> 接收正常 五、总结12参数名接收到,但参数值接收不到,这很怪异,一开始没有怀疑缓存原因,归根到底是对soap的基础理解得不够深刻。使用排除法定位问题的速度还是比较局限。透过现象去了解程序的本质,设计思想,对于分析、解决问题有很大的帮助