我file_get_contents()
用来执行POST到API服务。这适用于大多数查询。但是,最近我在内容中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
?我今天再次尝试了此方法……而不是在内容中混入标题,而是得到了空内容和部分标题。这个错误虽然很容易Google搜索,并且使我得到一个类似问题(怪异行为)的答案file_get_contents
。
如第一条评论所述,更改默认套接字超时可以解决我的问题(将其设置为60):
ini_set("default_socket_timeout", 600);
我不太确定套接字如何超时,因为接收到的数据和标头似乎已经完成...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句