PHP的file_get_contents()函数返回“failed to open stream: HTTP request failed!”

112

我在使用PHP代码调用URL时遇到了问题。我需要在我的PHP代码中使用查询字符串来调用一个服务。如果我将URL键入浏览器,它可以正常工作,但是如果我使用file-get-contents()函数进行调用,我会得到以下错误信息:

警告:file-get-contents(http://.... )无法打开流:HTTP请求失败!HTTP/1.1 202 Accepted in ...

我正在使用的代码是:

$query=file_get_contents('http://###.##.##.##/mp/get?mpsrc=http://mybucket.s3.amazonaws.com/11111.mpg&mpaction=convert format=flv');
echo($query);

就像我说的一样- 通过浏览器调用是可以正常工作的。有什么建议吗?

我还尝试使用另一个URL:

$query=file_get_contents('http://www.youtube.com/watch?v=XiFrfeJ8dKM');

这个可以正常工作... 是否可能是我需要调用的网址中有第二个http://?

16个回答

2
$query=file_get_contents('http://###.##.##.##/mp/get?' . http_build_query(array('mpsrc' => 'http://mybucket.s3.amazonaws.com/11111.mpg&mpaction=convert format=flv')));

1

这对我来说不起作用,结果查询返回了null值。所以我在postman上检查了一下,看看api是否实际返回值,确实是有的。Postman在右侧有一个选项卡,您可以获取用于获取结果的示例代码,尝试后终于成功了,但最初可能会出现奇怪的错误411,提示需要指定POST长度,我在我的代码中添加了修复方法。要绕过411 POST长度错误,请创建一个空数组并使用http_build_query函数。然后将该变量设置为CURLOPT_POSTFIELDS curl选项。

$data_string = array();
$curl = curl_init();
$test = http_build_query($data_string);
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://www.googleapis.com/geolocation/v1/geolocate?key=APIKEY',
CURLOPT_POSTFIELDS => $test,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

这对我有用,谢谢!我不知道为什么这个有效而其他的不行。 - code_gamer

0

我也遇到了同样的问题,但是这是防火墙问题……一旦我将API服务器加入白名单,使用get_file_contents($url)和上面提到的curl方法就可以正常工作了。

在发现防火墙规则问题之前,浪费了好几个小时的时间。


0

这是对我有效的方法... 我没有使用curl。

我能够通过浏览器访问特定的API URL,但在使用file_get_contents时,它会出现“无法打开流”的错误。

然后,我修改了我想要调用的API URL,通过使用urlencoding编码所有双引号,并保持其他内容不变。

下面给出了示例格式:

$url = 'https://stackoverflow.com/questions'.urlencode('"'.$variable1.'"');

然后使用

file_get_contents($url);


0
对我来说,问题在于Content-Length头中的值不正确。该值过大,因此nginx一直在等待从未到达的其余内容。

-5

使用这个

file_get_contents($my_url,null,null);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接