确定PHP中超时的根本原因

时间:2011-12-01 19:59:03

标签: php curl timeout file-get-contents

不久之前我注意到我的应用程序发出了一些Soap错误,我开始调查它们。像:

  • SoapClient::SoapClient(http://###.###.###.###:8080/path/to/some.wsdl): failed to open stream: HTTP request failed!
  • SoapClient::SoapClient(): I/O warning : failed to load external entity "http://###.###.###.###:8080/path/to/some.wsdl"
  • SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://###.###.###.###:8080/path/to/some.wsdl' : failed to load external entity "http://###.###.###.###:8080/path/to/some.wsdl"

它看起来像是远程服务器上的超时(WSDL缓存已关闭)。在弹出该服务器并且没有运气之后,我试着只是file_get-contents() WSDL来看看会发生什么......

没有骰子:大约20秒左右后,我得到了相同的流错误:

  

file_get_contents(http://###.###.###.###:8080/path/to/some.wsdl) [<a href='function.file-get-contents'>function.file-get-contents</a>]: failed to open stream: HTTP request failed!

在最后的努力中,我尝试通过curl_*函数阅读内容,事实上我确实得到了我正在寻找的内容。

... tl; dr?

  • SoapClient和file_get_contents似乎超时(虽然不是明确的“无法打开流,连接超时”)
  • 出现与流有关,因为curl给了我正在寻找的东西。
  • 我有很多依赖于SoapClientfile_get_contents的代码,所以切换到所有卷曲解决方案并不是一个真正的选择。
  • 这不是DNS问题,因为我可以很好地解析外部名称(我的目标资源是IP)
  • allow_url_fopen已启用。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

{p> allow_url_fopen需要在On的PHP设置中file_get_contents才能使用网址。否则它会给你那个确切的错误。通过加载phpinfo();调用页面来仔细检查您的PHP设置,以确保它们不会被其他php.ini或.htaccess文件覆盖。

我猜测防火墙问题,但你说curl可以在PHP内部工作,这将以相同的方式打开套接字。