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


При попытке запустить свой PHP-скрипт я получаю следующую ошибку:

Не удалось открыть поток: такого файла или каталога в C:\wamp\www\LOF\Data.php на линии 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);

?>

Примечание: *key* является заменой строки в URL-адресе (мой ключ API) и был скрыт по соображениям конфиденциальности.

Я удалил https:// из URL-адреса, чтобы одна ошибка исчезла.

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

 18
Author: Amal Murali, 2013-12-13

5 answers

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

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

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

Что касается следующей ошибки:

Не удалось найти оболочку - вы забыли включить ее при настройке PHP?

Ваша установка Apache, вероятно, не была скомпилирована с поддержкой SSL. Вы можете вручную попытаться установить OpenSSL и использовать его или использовать 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));
 27
Author: Amal Murali, 2013-12-13 08:55:21

Почему бы вам не использовать 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);
}
}
 1
Author: Shankar Damodaran, 2013-12-13 08:50:55

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

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

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

 1
Author: Shubham, 2015-01-05 06:13:27

Просто чтобы расширить ответы Шанкаров и амалов с помощью простого модульного тестирования:

/**
 *
 * 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);
}
 0
Author: pgee70, 2017-07-26 11:39:51

Мы можем решить эту проблему с помощью 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);
 0
Author: Jitendra Damor, 2017-10-24 04:31:46