file_get_contents返回内容中的HTTP标头

时间:2016-04-21 12:42:14

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

我正在使用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分钟才能完成

1 个答案:

答案 0 :(得分:0)

我今天再次尝试过这个...而不是内容中混合的标题,我得到了空内容和部分标题。这个错误虽然更容易谷歌并引导我this SO answer谈论类似的问题(奇怪的file_get_contents行为)。

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

ini_set("default_socket_timeout", 600);

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