使用PHP,当尝试使用SOAP调用某个方法时,我总是破坏最大执行时间。但是,由于过去调用此方法有效,当我删除'cache_wsdl' => WSDL_CACHE_NONE
时,它开始工作。
如果我使用file_get_contents
获取WSDL,我会完全理解它。但是,当我调用方法时它只是不起作用
$client = new SoapClient("https://.../file.asmx?wsdl", array(
'soap_version' => SOAP_1_1,
'trace' => true,
'cache_wsdl' => WSDL_CACHE_NONE
));
$result = $client->SomeMethod($parameters);
在某些时候我能够得到错误:
Fatal error: Uncaught SoapFault exception: [HTTP] Error Fetching http headers in myfile.php
Stack trace:
#0 [internal function]: SoapClient->__doRequest('<?xml version="...', 'https://abc.def...', 'http://someser....', 1, 0)
#1 myfile.php(27): SoapClient->__call('SomeMethod', Array)
#2 myfile.php(27): SoapClient->SomeMethod(Object(Z)) #3 {main} thrown in myfile.php on line 27
我希望得到更多的诊断错误,但我不知道如何?
我支付这个WSDL服务并且它无法使用......这是WSDL服务器的错吗?我怎么能确定,我能对这个服务提供商说些什么?对SomeMethod的调用没有及时回答? (即使我能够下载WSDL)
答案 0 :(得分:1)
所以,你说当你禁用 wsdl_cache 时,服务就开始工作了。
由于在我的开发环境中将 wsdl_cache 变为“ on ”,我遇到了很多挫折时刻。问题是,如果您的开发环境中 wsdl_cache ,那么 SoapClient 对象将下载 wsdl 第一次调用服务时提交文件。然后我们假设您更改了现有函数的返回类型或名称,有时, SoapClient 对象将不会使用新修改下载新的 wsdl ,然后< strong>生成的xml soap请求将不再与Web服务描述匹配,并且调用将失败。
这种情况发生在我使用 Zend Framework 和类 Zend_Soap_Client 并根据我设置用于使用<处理服务请求的类的注释动态生成wsdl强> Zend_Soap_Autodiscover 强>
在linux中,php将缓存的wsdl文件存储在 / tmp 文件夹中,并带有filname前缀“ wsdl ”。您可以去那里并删除所有这些文件,然后下一个请求将获取新的wsdl。或者更好,只需关闭 php.ini 文件中的wsdl缓存设置,或者只将此行放在您拨打电话的脚本的最开头。< / p>
ini_set('soap.wsdl_cache_enabled',0);
PS :建议在开发环境上关闭 wsdl_cache ,因为对Web服务源代码进行了所有修改。关闭 wsdl_cache 可以大幅降低高流量生产环境的性能。 所以我只推荐开发。