File_get_contents() как исправить ошибку "Не удалось открыть поток", "Нет такого файла",

Я получаю следующую ошибку, когда пытаюсь запустить PHP script:

не удалось открыть поток: нет такого файла или каталога в C:\wamp\www\LOF\Data.php в строке 3 script:

Мой код выглядит следующим образом:

<?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-адреса, чтобы удалить одну ошибку.

Я делаю что-то неправильно здесь? Может быть, URL?

Ответ 1

В URL-адресе отсутствует информация о протоколе. PHP считает, что это путь к файловой системе и пытается получить доступ к файлу в указанном месте. Однако это место фактически не существует в вашей файловой системе и возникает ошибка.

Вам нужно добавить http или https в начале URL-адреса, с которого вы пытаетесь получить содержимое:

$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));

Ответ 2

Почему бы вам не использовать 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);
}
}

Ответ 3

Вы можете попробовать использовать этот

<?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"]);

изменить текущий рабочий каталог на корневой каталог вашего сайта, если путь относительный от корневого каталога.

Ответ 4

просто для того, чтобы продлить ответы Shankars и amals с помощью простого модульного тестирования:

/**
 *
 * workaround HTTPS problems with file_get_contents
 *
 * @param $url
 * @return boolean|string
 */
function curl_get_contents($url)
{
    $data = FALSE;
    if (filter_var($url, FILTER_VALIDATE_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;
}
// then in the unit tests:
public function test_curl_get_contents()
{
    $this->assertFalse(curl_get_contents(NULL));
    $this->assertFalse(curl_get_contents('foo'));
    $this->assertTrue(strlen(curl_get_contents('https://www.google.com')) > 0);
}

Ответ 5

Мы можем решить эту проблему, используя 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);