加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – file_get_contents https 1分钟超时?

发布时间:2020-12-13 16:58:55 所属栏目:PHP教程 来源:网络整理
导读:当通过https访问某些资源时,我的 PHP的file_get_contents挂起60秒有困难. 我不确定它是客户端还是服务器端问题. 在客户端 在命令行上工作: $URL="https://example.com/some/path"$wget "$URL" -O /dev/null -q # takes a few milliseconds$curl "$URL" /dev
当通过https访问某些资源时,我的 PHP的file_get_contents挂起60秒有困难.

我不确定它是客户端还是服务器端问题.

在客户端

在命令行上工作:

$URL="https://example.com/some/path"
$wget "$URL" -O /dev/null -q # takes a few milliseconds
$curl "$URL" >/dev/null      # takes a few milliseconds
$php -r 'file_get_contents("'"$URL"'")' # takes 61s!

在服务器上

一条线被立即写入Apache(2.4)访问日志以获取正确的SSL vhost,并且响应为200(成功).这令人困惑的时间表令人困惑:

客户端触发了> 0s php的file_get_contents
> 0.2s服务器的apache访问日志记录成功(200).
> ???谁知道这里发生了什么?
> 60.2s客户端收到该文件.

从Ubuntu 14.04和Debian 8客户端测试.有问题的资源都在运行带有ITK worker和PHP 5.6的Apache 2.4的Debian 8服务器上.我已经尝试了防火墙关闭(默认的ACCEPT策略),所以不是这样.铌.服务器已禁用IPv6,这可能是相关的,因为当我首先尝试IPv6时,我注意到这样的超时.但是被访问的主机没有AAAA记录,并且apache日志显示(a)SSL已建立好并且(b)请求有效并已收到.

解决方法

一个可能的答案:您确定客户端仅在60.2秒后收到文件吗?如果我没记错的话,file_get_contents()有一个讨厌的习惯,就是在它认为请求完成之前等待远程连接关闭.这意味着,如果您的服务器使用HTTP保持活动状态,一旦所有数据传输完成后,有效地保持连接一段时间,您的应用程序可能会挂起.

这样的事情有帮助吗?

$context = stream_context_create(['http' => ['header' => 'Connection: closern']]);
file_get_contents("https://example.com/some/path",false,$context);

注意:您可能需要使用“https”作为该阵列中的密钥;我不记得我的头脑了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读