【问题标题】:Identifying root cause of a timeout in PHP确定 PHP 中超时的根本原因
【发布时间】:2012-01-10 23:04:13
【问题描述】:

不久前,我注意到我的应用程序发出了一些 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;博士?

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

有什么想法吗?

【问题讨论】:

  • 出于好奇,您是否在 cURL 工作后使用 SoapClient 尝试了服务器?即服务器宕机了吗?
  • 我做到了,在将涉及的两台服务器弹回后,问题仍然存在。

标签: php curl timeout file-get-contents


【解决方案1】:

allow_url_fopen 需要在 PHP 设置中为 Onfile_get_contents 才能使用 URL。否则它会给你那个确切的错误。通过加载带有 phpinfo(); 调用的页面来仔细检查您的 PHP 设置,以确保它们没有被不同的 php.ini 或 .htaccess 文件覆盖。

否则我猜是防火墙问题,但你说 curl 在 PHP 内部工作,它会以相同的方式打开套接字。

【讨论】:

  • 感谢您提及,我忘了提及。我确实启用了allow_url_fopen
  • 您是在 Linux/Mac 系统上运行它吗?我们可以试试 strace/dtrace 看看系统调用实际上在做什么。
  • 它是 RHEL 或 CentOS(我不记得了),所以这是一个选项。
  • 问题与防火墙有关。我们能够将其隔离到本周某个时候安装的新设备上。我仍然不确定为什么 curl 可以正常工作,但是使用基于流的函数却不行。感谢您帮助确定这一点。
  • @MikeG - 您能否分享导致此问题的防火墙问题的任何详细信息?我们面临着类似的问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-22
  • 1970-01-01
相关资源
最近更新 更多