【发布时间】:2019-04-12 16:00:49
【问题描述】:
我正在使用 PHP 代码通过 PHP HTTP wrapper 从 HTTP 服务器检索资源,例如:
file_get_contents("http://...");
当 PHP 发送 HTTP/1.0 请求时,服务器以带有 Connection: Keep-Alive 标头的 HTTP/1.1 响应响应:
HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Length: ...
虽然 PHP 没有办法使用长连接,但它似乎毫无意义地等待 HTTP 连接关闭。服务器仅在不活动 60 秒后关闭它。
有什么办法可以防止PHP HTTP wrapper 等待服务器关闭连接,而是在收到Content-Length header 宣布的数据后自行关闭?
或者至少使用fopen 和fread 循环读取直到我得到Content-Length 字节是否安全?
我发现的唯一解决方法是设置 timeout HTTP context option 以减少等待时间。但显然我需要将超时设置得足够高,以确保它不会中断响应的读取,所以它仍然远非理想。
我尝试过的其他方法都没有成功:
- 使用 HTTP/1.1(使用
protocol_version上下文选项),希望它能让 PHP 意识到持久连接 - 使用
Connection: close标头(服务器忽略它)
【问题讨论】:
-
我建议卷曲。如果服务器打得不好,file_get_contents 不使用 Content-Length,怎么办?
-
@SH- 我希望有一个(上下文)选项可以让它工作。或者另一个简单的实现,可能使用
fopen+fread并明确使用Content-Length标头。 -
是的,我看了看文档,什么也没看到。除非源代码中有隐藏的参数...至于简单,文档建议套接字 I/O...
-
没关系,fclose 不适用于 file_get_contents:stackoverflow.com/questions/19650817/…
标签: php http http-headers keep-alive