我的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脚本调用它似乎很慢,因为当从以下位置之一访问时文件会立即打开:
防火墙中的端口80和443已打开。根据另一个帖子的建议,我找到了两个解决方法:
但我仍然想知道它为什么不能使用原始网址。
似乎Web服务没有关闭连接,换句话说,我只在达到服务器配置中设置的超时后才得到响应。我尝试在我的Nginx配置中设置keepalive_timeout 15;
,但它不起作用。
是否存在强制服务器关闭连接的SOAP / PHP参数?
答案 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)
测试了这个