SoapClient call not executing - timeout


SoapClient call not executing - timeout

对于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服务器的错误吗?我怎样才能确定,我能对这个服务提供者说些什么?对someemethod的调用没有及时响应?(即使我能够下载WSDL)

所以,您说当禁用wsdl_cache时,服务开始工作。

我有很多沮丧的时刻,因为在我的开发环境中,wsdl_cache打开了"on"。问题是,如果您在开发环境中将wsdl_cache打开,那么SoapClient对象将在您第一次调用服务时下载wsdl文件。然后让我们假设您更改了返回类型或现有函数的名称,有时,SoapClient对象将不会下载新的wsdl与新的修改,然后生成的xml soap请求不再匹配web服务描述,调用将失败。

这种情况发生在我使用Zend Framework和类Zend_Soap_Client并根据我设置的类的注释动态生成wsdl,以使用Zend_Soap_Autodiscover处理服务请求。

在linux中,php将缓存的wsdl文件存储在/tmp文件夹中,文件名前缀为"wsdl"。您可以到那里删除所有这些文件,然后下一个请求将获取新的wsdl。或者更好的做法是,在php.ini文件中关闭 wsdl缓存设置,或者将这一行放在进行调用的脚本的最开头。

ini_set('soap.wsdl_cache_enabled',0);

PS:建议在开发环境上关闭wsdl_cache,因为对web服务源代码进行了所有修改。关闭wsdl_cache会显著降低高流量生产环境的性能。