2016-04-21 53 views
0

我正在使用file_get_contents()执行POST到API服务。这适用于大多数查询。但是,最近我有一个失败,其中file_get_contents()在内容中返回HTTP标头!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:(一)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分钟才能完成
+0

'10.72.18.21'是一个专用网络地址,请与您的技术支持人员核对,他们最近没有在混音中的某个地方添加代理服务器,或者更改了一直存在的代理服务器的配置 – RiggsFolly

+0

@RiggsFolly嗨,实际上,IP是一个(自定义)代理服务器:)过滤我的查询,并反过来使用真正的API(我无法访问),reo整理结果并将其发回。然而,我已经测试过卷曲和浏览器,它的工作原理...所以我不认为是一个网络问题 – urban

回答

0

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

作为第一个评论暗示,更改默认套接字超时解决我的问题(它被设置为60):

ini_set("default_socket_timeout", 600); 

我不太清楚插座怎么能因为数据超时和接收头似乎完整...

相关问题