web-dev-qa-db-fra.com

PHP file_get_contents () renvoie "impossible d'ouvrir le flux: la requête HTTP a échoué!"

J'ai des problèmes pour appeler une URL à partir de PHP code. J'ai besoin d'appeler un service à l'aide d'une chaîne de requête à partir de mon PHP. Si je tape l'URL dans un navigateur, cela fonctionne bien, mais si j'utilise file-get-contents () pour effectuer l'appel, je reçois:

Avertissement: échec de l'ouverture du flux de fichiers (get: contents) (http: // ....): échec de la demande HTTP! HTTP/1.1 202 Accepté dans ...

Le code que j'utilise est:

$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 - appelez depuis le navigateur et cela fonctionne bien. Aucune suggestion?

J'ai aussi essayé avec une autre URL telle que:

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

Cela fonctionne bien ... est-ce que l'URL que je dois appeler a une seconde http:// dedans?

78
undefined

Essayez d'utiliser cURL.

<?php

$curl_handle=curl_init();
curl_setopt($curl_handle, CURLOPT_URL,'http://###.##.##.##/mp/get?mpsrc=http://mybucket.s3.amazonaws.com/11111.mpg&mpaction=convert format=flv');
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_handle, CURLOPT_USERAGENT, 'Your application name');
$query = curl_exec($curl_handle);
curl_close($curl_handle);

?>
100
James Hall
25
SilentGhost
<?php

$lurl=get_fcontent("http://ip2.cc/?api=cname&ip=84.228.229.81");
echo"cid:".$lurl[0]."<BR>";


function get_fcontent( $url,  $javascript_loop = 0, $timeout = 5 ) {
    $url = str_replace( "&amp;", "&", 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 );    # required for https urls
    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 );
    }
}


?>
21
pangeli

file_get_contents() utilise les wrappers fopen(), par conséquent, il est interdit d'accéder aux URL via le allow_url_fopen option dans php.ini.

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

20
Michael Wales

Je remarque que votre URL contient des espaces. Je pense que c'est généralement une mauvaise chose. Essayez d’encoder l’URL avec

$my_url = urlencode("my url");

puis en appelant

file_get_contents($my_url);

et voyez si vous avez plus de chance.

7
shady

Vous devez fondamentalement envoyer des informations avec la demande.

Essaye ça,

$opts = array('http'=>array('header' => "User-Agent:MyAgent/1.0\r\n")); 
//Basically adding headers to the request
$context = stream_context_create($opts);
$html = file_get_contents($url,false,$context);
$html = htmlspecialchars($html);

Cela a fonctionné pour moi

7
d_bhatnagar

Je ne suis pas sûr des paramètres (mpaction, format), s'ils sont spécifiés pour la page amazonaws ou ##. ##.

Essayez de rlencode () l'URL.

3
alexn

J'ai un problème similaire, j'ai analysé l'URL youtube. Le code est;

$json_is = "http://gdata.youtube.com/feeds/api/videos?q=".$this->video_url."&max-results=1&alt=json";
$video_info = json_decode ( file_get_contents ( $json_is ), true );     
$video_title = is_array ( $video_info ) ? $video_info ['feed'] ['entry'] [0] ['title'] ['$t'] : '';

Ensuite, je réalise que $this->video_url Inclut les espaces. J'ai résolu cela en utilisant trim($this->video_url).

Peut-être que ça va vous aider. Bonne chance

3
Emre Karataşoğlu
$query=file_get_contents('http://###.##.##.##/mp/get?' . http_build_query(array('mpsrc' => 'http://mybucket.s3.amazonaws.com/11111.mpg&mpaction=convert format=flv')));
0
Sergey