【问题标题】:file_get_contents returns HTTP headers in contentfile_get_contents 在内容中返回 HTTP 标头
【发布时间】:2016-08-14 16:15:16
【问题描述】:

我正在使用file_get_contents() 对 API 服务执行 POST。这适用于大多数查询。但是,最近我遇到了一个失败,file_get_contents() 在内容中返回了 HTTP 标头!

代码:

$resp = file_get_contents("http://10.72.18.21:8000",false, $context);
var_dump($resp);
var_dump($http_response_header);

我每次都会得到以下内容和标题:

string(114328) "Server: Spark Proxy Server
Content-Length: 114272

{"records":....}
"
array(1) {
  [0]=>
  string(31) "HTTP/1.0 200 Spark Proxy Server"
}

请注意,在$resp 中,您可以看到通常应在$http_response_header 中解析的标题(前两行)。

我还尝试了两种不同的 POST 方法:(a) fopen + while 循环和 (b) fopen + stream_get_contents。在所有三种情况下,结果都是相同的。这三者之间的共同点是我使用创建的流上下文:

$opts = array('http' =>
array(
    'method'  => 'POST',
    'header'  => 'Content-type: application/x-www-form-urlencoded;charset=utf-8',
    'content' => http_build_query($params)
    )
);

$context  = stream_context_create($opts);

现在,使用相同的代码查询相同的 API,但修改了一个参数,一切都按预期工作,完整的标头是:

array(3) {
  [0]=>
  string(31) "HTTP/1.0 200 Spark Proxy Server"
  [1]=>
  string(26) "Server: Spark Proxy Server"
  [2]=>
  string(19) "Content-Length: 288"
}

最后,我尝试了使用 python 和 cUrl 失败的相同调用,并且在这两种情况下结果都是正确的,所以我很确定这是与 php 相关的问题。

问题:

  • 以前有人见过这种行为吗?
  • 有没有办法在不使用 stream_context_create 的情况下执行相同的 POST?
  • 可能与时间有关吗?失败的示例最多需要 1.4 分钟才能完成

【问题讨论】:

  • 10.72.18.21 是一个私有网络地址,请与您的技术支持人员确认他们最近没有在其中的某处添加代理服务器,或者更改了一直存在的代理服务器的配置跨度>
  • @RiggsFolly 嗨,实际上,IP 是一个(自定义)代理服务器 :) 过滤我的查询,然后使用真正的 API(我无法访问),重新组织结果并将它们发回。但是,我已经使用 curl 和浏览器进行了测试,并且可以正常工作......所以我认为不是网络问题

标签: php http-headers http-post file-get-contents


【解决方案1】:

我今天又试了一次……我没有在内容中混合标题,而是得到了空内容和部分标题。虽然这个错误更容易用谷歌搜索并引导我到this SO answer 谈论类似的问题(奇怪的file_get_contents 行为)。

正如第一条评论所暗示的,更改默认套接字超时解决了我的问题(设置为 60):

ini_set("default_socket_timeout", 600);

我不太确定套接字如何超时,因为接收到的数据和标头似乎已完成...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 2016-03-30
    • 2011-11-17
    • 1970-01-01
    • 2016-04-17
    相关资源
    最近更新 更多