【问题标题】:Could not connect to host, SoapFault exception after some requests一些请求后无法连接到主机,SoapFault 异常
【发布时间】:2017-04-14 13:40:24
【问题描述】:

我正在连接到网络服务以获取一些数据。我有一个包含大约 20 万个作业的请求队列,一个工作人员正在处理它。处理时间为每秒 2-3 次调用。大约 500-1000 次调用后,它开始收到 SoapFault 异常并显示以下消息:Could not connect to host。即使出现此错误,我也能够正确 ping 网络服务服务器。

当我禁用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)

我与:

  • PHP 7.0.11
  • Lumen (5.2.9)(Laravel 组件 5.2.*)

【问题讨论】:

  • 您是否为每次调用创建一个新的 SoapClient 实例?这将为每个新呼叫保持连接打开。

标签: php laravel soap soap-client lumen


【解决方案1】:

就我而言,问题是同时打开的连接太多。我通过keep_alive 选项修复了它:

$client = new SoapClient('http://thewebservice.com/method/Service.asmx?WSDL', ['keep_alive' => false]);
$response = $client->__soapCall('method name', $parameters)

【讨论】:

  • 是的,在将 Soap 请求作为 Laravel 队列作业处理时,我遇到了同样的“无法连接到主机”。 SoapClient 正在使用 keep_alive 而不是关闭连接,但它也为每个作业/请求创建了一个新连接,因此最终淹没了远程服务器。将 keep_alive 设置为 false 解决了问题,感谢您分享您的答案。
【解决方案2】:

您是否为每个调用创建一个新的 SoapClient 实例?在这种情况下,禁用keep_alive 只是一种解决方法,可以改进。

SoapClient 默认发送 HTTP Header Connection: Keep-Alive(通过构造函数选项keep_alive)。但是,如果您为队列中的每个调用创建一个新的 SoapClient 实例,这将每次都创建并保持打开一个新连接。如果调用执行得足够快,您最终将遇到 1000 个左右打开连接的限制,这将导致 SoapFault: Could not connect to host

因此,请确保您创建了一次 SoapClient 并将其重用于后续调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    相关资源
    最近更新 更多