web-dev-qa-db-fra.com

file_get_contents () comment corriger l'erreur "Impossible d'ouvrir le flux", "Aucun fichier de ce type"

Le message d'erreur suivant s'affiche lorsque j'essaie d'exécuter mon script PHP:

impossible d'ouvrir le flux: Aucun fichier ni répertoire de ce type dans C:\wamp\www\LOF\Data.php à la ligne 3 scénario:

Mon code est le suivant:

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

?>

Remarque: *key* remplace une chaîne dans l'URL (ma clé API) et a été masqué pour des raisons de confidentialité.

J'ai supprimé le https:// de l'URL pour qu'une erreur disparaisse. 

Est-ce que je fais quelque chose de mal ici? Peut-être l'URL?

22
Life of Madness

L'URL manque les informations de protocole. PHP pense qu'il s'agit d'un chemin de système de fichiers et tente d'accéder au fichier à l'emplacement spécifié. Cependant, l'emplacement n'existe pas dans votre système de fichiers et une erreur est générée. 

Vous devrez ajouter http ou https au début de l'URL à partir de laquelle vous tentez d'obtenir le contenu:

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

Quant à l'erreur suivante:

Impossible de trouver le wrapper - avez-vous oublié de l'activer lorsque vous avez configuré PHP?

Votre installation Apache n’a probablement pas été compilée avec le support SSL. Vous pouvez manuellement essayer d'installer OpenSSL et l'utiliser, ou utiliser cURL. Personnellement, je préfère cURL à file_get_contents(). Voici une fonction que vous pouvez utiliser:

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;
}

Usage:

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

Vous pouvez essayer d'utiliser ceci 

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

Le "./" permet de rechercher l’URL du répertoire courant . Vous pouvez utiliser 

chdir($_SERVER["DOCUMENT_ROOT"]);

changer le répertoire de travail actuel à la racine de votre site Web si le chemin est relatif à partir du répertoire racine.

1
Shubham

Pourquoi n'utilisez-vous pas 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
Shankar Damodaran

juste pour étendre les réponses Shankars et amals avec des tests unitaires simples:

/**
 *
 * 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
pgee70

Nous pouvons résoudre ce problème en utilisant 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
Jitendra Damor