我正在连接到web服务以获取一些数据。我有一个约200K个工作的请求队列,一个工人正在处理它。处理时间为每秒2-3个呼叫。在大约500-1000次调用之后,它会通过以下消息开始获取SoapFault异常:Could not connect to host
。即使我收到此错误,我也能正确ping通web服务服务器。
当我禁用soap缓存时,问题仍然存在,但错误更改为Parsing WSDL: Couldn't load from 'http://thewebservice.com/method/Service.asmx?WSDL' : failed to load external entity
连接代码:
$client = new SoapClient('http://thewebservice.com/method/Service.asmx?WSDL');
$response = $client->__soapCall('method name', $parameters)
我合作:
答案 0 :(得分:1)
您是否为每个调用都创建一个新的SoapClient实例?在这种情况下,禁用keep_alive
只是一种解决方法,可以对此进行改进。
默认情况下,SoapClient发送HTTP标头Connection: Keep-Alive
(通过构造函数选项keep_alive
)。但是,如果您为队列中的每个呼叫创建一个新的SoapClient实例,则这将每次创建并保持打开状态。如果调用执行得足够快,您最终将遇到约1000个打开的连接的限制,这将导致SoapFault: Could not connect to host
。
因此,请确保创建一次SoapClient,并将其重新用于后续调用。