file_get_contents()如何修复错误“无法打开流”,“没有这样的文件”

时间:2013-12-13 08:46:26

标签: php https

我尝试运行PHP脚本时收到以下错误:

  

无法打开流:第3行的C:\ wamp \ www \ LOF \ Data.php中没有此类文件或目录   脚本:

我的代码如下:

<?php

$json = json_decode(file_get_contents('prod.api.pvp.net/api/lol/euw/v1.1/game/by-summoner/20986461/recent?api_key=*key*'));

print_r($json);

?>

注意:*key*是URL(我的API密钥)中字符串的替代品,并且出于隐私原因而被隐藏。

我从网址中删除了https://以使一个错误消失。

我在这里做错了吗?也许是URL?

8 个答案:

答案 0 :(得分:29)

URL缺少协议信息。 PHP认为它是一个文件系统路径,并尝试访问指定位置的文件。但是,该位置实际上并不存在于您的文件系统中,并且会引发错误。

您需要在要尝试获取内容的网址的开头添加httphttps

$json = json_decode(file_get_contents('http://...'));

至于以下错误:

  

无法找到包装器 - 您是否忘记在配置PHP时启用它?

您的Apache安装可能未使用SSL支持进行编译。您可以手动尝试安装OpenSSL并使用它,或使用cURL。我个人更喜欢cURL而不是file_get_contents()。这是您可以使用的功能:

function curl_get_contents($url)
{
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
  $data = curl_exec($ch);
  curl_close($ch);
  return $data;
}

用法:

$url = 'https://...';
$json = json_decode(curl_get_contents($url));

答案 1 :(得分:1)

为什么不使用cURL

$yourkey="your api key";
$url="https://prod.api.pvp.net/api/lol/euw/v1.1/game/by-summoner/20986461/recent?api_key=$yourkey";
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

$auth = curl_exec($curl);
if($auth)
{
$json = json_decode($auth); 
print_r($json);
}
}

答案 2 :(得分:1)

您可以尝试使用此

<?php
$json = json_decode(file_get_contents('./prod.api.pvp.net/api/lol/euw/v1.1/game/by-summoner/20986461/recent?api_key=*key*'));
print_r($json);
?>

“./”允许从当前目录中搜索url。 你可以使用

chdir($_SERVER["DOCUMENT_ROOT"]);

如果路径与根目录相对,则将当前工作目录更改为您网站的根目录。

答案 3 :(得分:0)

只需通过简单的单元测试来扩展Shankars和amals的答案:

id

答案 4 :(得分:0)

我们可以使用Curl ....

来解决这个问题
function my_curl_fun($url) {
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
 $data = curl_exec($ch);
 curl_close($ch);
 return $data;
}

$feed = 'http://................'; /* Insert URL here */
$data = my_curl_fun($feed);

答案 5 :(得分:0)

我希望以下解决方案对您都有效,因为我的网站也遇到同样的问题...

对于:$json = json_decode(file_get_contents('http://...'));

替换为以下查询

$Details= unserialize(file_get_contents('http://......'));

答案 6 :(得分:0)

此错误的实际问题与file_get_content无关,问题在于所请求的url(如果该URL不会抛出页面内容并将请求重定向到其他地方,file_get_content表示“无法打开流”,只是在file_get_contents检查url是否正常工作和不重定向之前,这里是代码:

功能checkRedirect404($ url) {

$ch = curl_init();

curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    curl_setopt($ch, CURLOPT_URL, $url);
    $out = curl_exec($ch);

    // line endings is the wonkiest piece of this whole thing
    $out = str_replace("\r", "", $out);

    // only look at the headers
    $headers_end = strpos($out, "\n\n");
    if( $headers_end !== false ) { 
        $out = substr($out, 0, $headers_end);
    }   

    $headers = explode("\n", $out);
    foreach($headers as $header) {
        if( substr($header, 0, 10) == "Location: " ) { 
            $target = substr($header, 10);

            //echo "Redirects: $target<br>";

            return true;
        }   
    }   

    return false;

}

答案 7 :(得分:0)

我只是通过在url中编码参数来解决这个问题。
网址可能是:http://abc/dgdc.php?p1=Hello&p2=some words
我们只需要对params2进行编码。

$params2 = "some words";
$params2 = urlencode($params2);

$url = "http://abc/dgdc.php?p1=djkl&p2=$params2"

$result = file_get_contents($url);