PHP SOAP非常慢:只有在达到fastcgi_read_timeout之后才有响应


PHP SOAP awfully slow: Response only after reaching fastcgi_read_timeout

我的wsdl web服务中SOAP客户端的构造函数非常慢,我只有在达到Nginx配置中的fastcgi_read_timeout值后才能得到响应,似乎远程服务器没有关闭连接。我还需要将其设置为至少15秒,否则我将不会得到任何响应。

我已经在SO上读到了类似的帖子,尤其是这篇PHP SoapClient构造函数速度很慢,而且它是链接线程的,但我仍然找不到问题的实际原因。

这是需要15秒以上的部分:

$client = new SoapClient("https://apps.correios.com.br/SigepMasterJPA/AtendeClienteService/AtendeCliente?wsdl");

当从我的php脚本调用时,它似乎只是很慢,因为当从以下位置之一访问时,文件会立即打开:

  • 运行脚本的服务器上的wget
  • SoapUI或Postman(但我不知道他们以前是否缓存过)
  • 在浏览器中打开URL

防火墙中的端口80和443处于打开状态。根据另一个线程的建议,我找到了两个解决方案:

  • 从本地文件加载wsdl=>快速
  • 启用wsdl缓存并快速使用远程URL=>

但我仍然想知道为什么它不能与原始URL一起使用。

似乎web服务没有关闭连接,或者换句话说,我只有在达到服务器配置中设置的超时后才能得到响应。我尝试在Nginx配置中设置keepalive_timeout 15;,但它不起作用。

是否有任何SOAP/PHP参数会迫使服务器关闭连接?

我能够重现这个问题,并在您引用的问题中链接的问题的公认答案中找到了问题的解决方案(有效,可能不是最好的):

PHP:SoapClient构造函数非常慢(需要3分钟)

根据答案,您可以使用stream_context选项调整HTTP标头。

$client = new SoapClient("https://apps.correios.com.br/SigepMasterJPA/AtendeClienteService/AtendeCliente?wsdl",array(
    'stream_context'=>stream_context_create(
        array('http'=>
            array(
                'protocol_version'=>'1.0',
                'header' => 'Connection: Close'
            )
        )
    )
));

有关stream_context选项的更多信息,请参阅http://php.net/manual/en/soapclient.soapclient.php

我使用PHP 5.6.1-1ubuntu3.1(cli)

对此进行了测试