执行SOAP调用的工作进程会生成无限的CLOSE_WAIT文件描述符

时间:2017-04-07 08:03:35

标签: php soap worker

我正在运行一个PHP队列工作进程来处理作业,这些作业又创建SOAP客户端并执行SOAP请求。我将尝试尽可能清楚地概述伪代码。

作业和参数保存到数据库中,由工作者实例化。简化形式,工人看起来像这样:

while(true) {
    $job = initiateFromDatabase($id);
    $job->handle()
}

对于某个作业,将实例化SOAPClient并执行SOAP调用。一些结果将保存到数据库中。

问题是该进程很快就会达到打开文件描述符限制。在使用lsof -a -p <worker_pid>进行一些检查之后,CLOSE_WAIT中有数百个TCP描述符。

我已经进行了深入的研究,我的结论是没有办法显式关闭SOAP连接(和底层)套接字。

清除数百个CLOSE_WAIT描述符的唯一方法就是杀死工作进程。

如何确保我可以在更长时间内运行worker并在不再使用SOAPClient实例后使CLOSE_WAIT描述符消失?

提前致谢。

1 个答案:

答案 0 :(得分:2)

我通过将keep_alive选项设置为false解决了该问题

 $client = new SoapClient($wsdl_url, array('keep_alive'=>false));