114 votes

Le fichier PHP file_get_contents() retourne "impossible d'ouvrir le flux : échec de la requête HTTP!"

Je rencontre des problèmes pour appeler une URL depuis du code PHP. J'ai besoin d'appeler un service en utilisant une chaîne de requête depuis mon code PHP. Si je tape l'URL dans un navigateur, cela fonctionne correctement, mais si j'utilise file-get-contents() pour faire l'appel, j'obtiens :

Avertissement : file-get-contents(http://.... ) n'a pas pu ouvrir le flux : La requête HTTP a échoué ! HTTP/1.1 202 Accepté dans ...

Le code que j'utilise est le suivant :

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

Comme je l'ai dit - ça fonctionne bien depuis le navigateur. Des suggestions ?

J'ai également essayé avec une autre URL comme :

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

Cela fonctionne bien... est-ce que l'URL que je dois appeler aurait un deuxième http:// dedans ?

126voto

James Hall Points 2020

Essayez d'utiliser cURL.

12 votes

Il s'agit d'une complication excessive lorsque le véritable problème réside dans les esperluettes.

3 votes

@Christian, pouvez-vous développer davantage ?

6 votes

Tout le monde n'a pas (mais devrait pourtant) cURL installé. cURL est certainement beaucoup plus rapide la plupart du temps, mais file_get_contents n'est pas si lent et ne nécessite pas de se souvenir de toutes les options à chaque utilisation.

33voto

0 votes

J'ai eu la même erreur que l'OP avait, et voici mon problème - des espaces dans les arguments. urlencode() sur les paramètres GET a résolu le problème.

0 votes

Si vous ne voulez pas utiliser la solution CURL, celle-ci fonctionne aussi ! Utilisez l'URLecnode sur les paramètres.

1 votes

Ceci est la solution réelle à ce problème.

24voto

pangeli Points 59
";

function get_fcontent( $url,  $javascript_loop = 0, $timeout = 5 ) {
    $url = str_replace( "&", "&", urldecode(trim($url)) );

    $cookie = tempnam ("/tmp", "CURLCOOKIE");
    $ch = curl_init();
    curl_setopt( $ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1" );
    curl_setopt( $ch, CURLOPT_URL, $url );
    curl_setopt( $ch, CURLOPT_COOKIEJAR, $cookie );
    curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
    curl_setopt( $ch, CURLOPT_ENCODING, "" );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
    curl_setopt( $ch, CURLOPT_AUTOREFERER, true );
    curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );    # nécessaire pour les URL en https
    curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, $timeout );
    curl_setopt( $ch, CURLOPT_TIMEOUT, $timeout );
    curl_setopt( $ch, CURLOPT_MAXREDIRS, 10 );
    $content = curl_exec( $ch );
    $response = curl_getinfo( $ch );
    curl_close ( $ch );

    if ($response['http_code'] == 301 || $response['http_code'] == 302) {
        ini_set("user_agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1");

        if ( $headers = get_headers($response['url']) ) {
            foreach( $headers as $value ) {
                if ( substr( strtolower($value), 0, 9 ) == "location:" )
                    return get_url( trim( substr( $value, 9, strlen($value) ) ) );
            }
        }
    }

    if (    ( preg_match("/>[[:space:]]+window\.location\.replace\('(.*)'\)/i", $content, $value) || preg_match("/>[[:space:]]+window\.location\=\"(.*)\"/i", $content, $value) ) && $javascript_loop < 5) {
        return get_url( $value[1], $javascript_loop+1 );
    } else {
        return array( $content, $response );
    }
}

?>

8 votes

Merci pour le code, on dirait que vous l'avez obtenu à partir de : php.net/manual/en/ref.curl.php Le principal problème est l'appel de fonction get_url devrait en fait être get_fcontent puisque vous avez changé le nom de la fonction elle-même. Il s'agit en fait d'un appel de fonction récursive qui réessaie d'obtenir le contenu de l'URL en modifiant certains paramètres.

0 votes

Tu l'as eu! J'essayais de passer en https et je me faisais refuser. Tu as bien réussi. UPVOTED ;)

23voto

Michael Wales Points 3308

file_get_contents() utilise les wrappers fopen(), il est donc limité dans l'accès aux URLs via l'option allow_url_fopen dans php.ini.

Vous devrez soit modifier votre php.ini pour activer cette option, soit utiliser une méthode alternative, à savoir cURL - de loin la méthode la plus populaire et, pour être honnête, la plus standard pour accomplir ce que vous essayez de faire.

0 votes

Pas grave, je viens de remarquer qu'il a dit que file_get_contents() fonctionnait sur une URL différente. Néanmoins, c'est toujours un bon conseil pour les autres ayant ce problème.

0 votes

Oui, j'ai regardé d'autres options et je vois que cURL est la manière standard d'y aller mais j'ai essayé ceci car c'était plus facile et cela a fonctionné avec d'autres urls, je pense que je dois redémarrer apache pour installer cURL? et je ne sais pas comment faire cela (une autre question)... merci pour votre réponse rapide

20voto

d_bhatnagar Points 181

Vous devez en fait envoyer des informations avec la requête.

Essayez ceci,

$opts = array('http'=>array('header' => "User-Agent:MyAgent/1.0\r\n")); 
//Essentiellement en ajoutant des en-têtes à la requête
$context = stream_context_create($opts);
$html = file_get_contents($url,false,$context);
$html = htmlspecialchars($html);

Cela a fonctionné pour moi

3 votes

Cela a également fonctionné pour moi! On dirait qu'il avait besoin d'un agent utilisateur

0 votes

Si l'URL semble correctement encodée, cela pourrait bien être le problème. Certains sites restreindront l'utilisation de 'User-Agent', peut-être aussi 'Accept'.

3 votes

Super réponse. votez pour promouvoir celle-ci en haut. tout en php et fonctionne également pour les requêtes https. juste deux lignes de code supplémentaires. et si le serveur partagé fournit curl? cela est très utile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X