我正在运行一个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描述符消失?
提前致谢。
答案 0 :(得分:2)
我通过将keep_alive选项设置为false解决了该问题
$client = new SoapClient($wsdl_url, array('keep_alive'=>false));