PHP SOAP非常慢:仅在达到fastcgi_read_timeout

时间:2016-01-06 23:51:55

标签: php soap nginx wsdl

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

我已经在SO上阅读了类似的帖子,特别是这个 PHP SoapClient constructor very slow以及它的链接线程,但我仍然无法找到问题的实际原因。

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

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

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

  • wget来自运行脚本的服务器
  • SoapUI或Postman(但我不知道他们之前是否缓存过它)
  • 在浏览器中打开网址

防火墙中的端口80和443已打开。根据另一个帖子的建议,我找到了两个解决方法:

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

但我仍然想知道它为什么不能使用原始网址。

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

是否存在强制服务器关闭连接的SOAP / PHP参数?

1 个答案:

答案 0 :(得分:1)

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

PHP: SoapClient constructor is very slow (takes 3 minutes)

根据答案,您可以使用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.11-1ubuntu3.1(cli)

测试了这个