file_get_contents returns HTTP headers 内容
file_get_contents returns HTTP headers in content
我正在使用 file_get_contents()
对 API 服务执行 POST。这适用于大多数查询。但是,最近我遇到了file_get_contents()
在内容中返回HTTPheaders的失败!
对于代码:
$resp = file_get_contents("http://10.72.18.21:8000",false, $context);
var_dump($resp);
var_dump($http_response_header);
我每次都headers得到以下内容:
string(114328) "Server: Spark Proxy Server
Content-Length: 114272
{"records":....}
"
array(1) {
[0]=>
string(31) "HTTP/1.0 200 Spark Proxy Server"
}
请注意,在 $resp
中,您可以看到 headers(前两行),通常应在 $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,但修改了单个参数,一切正常,完整的 headers 是:
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 分钟才能完成
我今天又试了一次...我得到的是空内容和部分内容 headers,而不是 headers 混合在内容中。这个错误虽然更容易 google 并导致我 this SO answer 谈论类似的问题(奇怪的 file_get_contents
行为)。
正如第一条评论所暗示的,更改默认套接字超时解决了我的问题(它被设置为 60):
ini_set("default_socket_timeout", 600);
我不太确定套接字是如何超时的,因为接收到的数据和 headers 似乎是完整的...
我正在使用 file_get_contents()
对 API 服务执行 POST。这适用于大多数查询。但是,最近我遇到了file_get_contents()
在内容中返回HTTPheaders的失败!
对于代码:
$resp = file_get_contents("http://10.72.18.21:8000",false, $context);
var_dump($resp);
var_dump($http_response_header);
我每次都headers得到以下内容:
string(114328) "Server: Spark Proxy Server
Content-Length: 114272
{"records":....}
"
array(1) {
[0]=>
string(31) "HTTP/1.0 200 Spark Proxy Server"
}
请注意,在 $resp
中,您可以看到 headers(前两行),通常应在 $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,但修改了单个参数,一切正常,完整的 headers 是:
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 分钟才能完成
我今天又试了一次...我得到的是空内容和部分内容 headers,而不是 headers 混合在内容中。这个错误虽然更容易 google 并导致我 this SO answer 谈论类似的问题(奇怪的 file_get_contents
行为)。
正如第一条评论所暗示的,更改默认套接字超时解决了我的问题(它被设置为 60):
ini_set("default_socket_timeout", 600);
我不太确定套接字是如何超时的,因为接收到的数据和 headers 似乎是完整的...