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

问题描述 投票:2回答:1

我正在运行一个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描述符消失?

提前致谢。

php soap worker
1个回答
3
投票

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

 $client = new SoapClient($wsdl_url, array('keep_alive'=>false));
© www.soinside.com 2019 - 2024. All rights reserved.