2009-03-30 7 views
58

J'ai des problèmes pour appeler une URL du code PHP. J'ai besoin d'appeler un service en utilisant une chaîne de requête de mon code PHP. Si je tape l'URL dans un navigateur, cela fonctionne bien, mais si j'utilise file-get-contents() pour passer l'appel, j'obtiens:PHP file_get_contents() retourne "Échec de l'ouverture du flux: requête HTTP échouée!"

Attention: file-get-contents (http: // ....) n'a pas réussi à ouvrir le flux: la requête HTTP a échoué! HTTP/1.1 202 Accepté dans ...

Le code 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 - appeler depuis le navigateur et il fonctionne très bien. Aucune suggestion?

J'ai aussi essayé avec une autre url comme:

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

Cela fonctionne très bien ... pourrait-il que l'URL que je dois appeler a une seconde http:// en elle?

Répondre

85

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

?> 
+4

C'est beaucoup trop compliqué quand le vrai problème se situe dans les esperluettes. – Christian

+0

@ Christian, pouvez-vous élaborer? – vonUbisch

+4

Tout le monde n'a pas (mais devrait cependant) installé cURL. cURL est bien sûr beaucoup plus rapide, mais file_get_contents n'est pas * non plus lent, et ne nécessite pas que vous vous souveniez de toutes les options quand vous l'utilisez. – Christian

2

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

Essayez le urlencode() l'URL.

+0

grâce - ce sont params pour l'instance mediaplug. Si je urlencode l'URL il ne fonctionne toujours pas - je reçois une URL très brouillée dans l'erreur ... ?? – undefined

+0

quel genre d'erreur? urlencode ne brouille pas l'URL. – SilentGhost

+0

Vous ne devez coder que la chaîne de paramètres: "convert format" doit être "convert% 20format" (ou bien "convert + format"). – bobince

20
+0

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

+0

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

+0

Ohhh mec merci beaucoup – Umair

5

Je remarque que votre URL comporte des espaces. Je pense que c'est généralement une mauvaise chose. Essayez coder l'URL avec

$my_url = urlencode("my url"); 

puis appeler

file_get_contents($my_url); 

et voir si vous avez plus de chance.

16

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

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

+0

Nevermind, juste remarqué qu'il a dit 'file_get_contents()' travaillé sur une URL différente. Néanmoins, c'est toujours un bon conseil pour les autres ayant ce problème. –

+0

oui, j'ai regardé d'autres options et voir que cURL est la façon standard d'y aller, mais j'ai essayé cela car il était plus facile et travaillé avec d'autres URLs, je pense que je dois redémarrer apache intsall cURL? et ne peux pas comprendre comment faire ceci (une autre question) ... merci pour votre réponse rapide – undefined

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


?> 
+5

Merci pour le code, on dirait que vous l'avez obtenu à partir de: http://php.net/manual/en/ref.curl.php Le problème principal est l'appel de fonction 'get_url' devrait ê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écursif qui tente de récupérer le contenu de l'URL en modifiant certains paramètres. –

+0

vous l'avez! essayait de https et devenait refusé. Vous avez réussi. UPVOTED;) –

2

j'ai eu un problème similaire, j'analysables 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'] : ''; 

Alors je me rends compte que $this->video_url comprennent les espaces blancs. J'ai résolu cela en utilisant trim($this->video_url).

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

-3

Utilisez cette

file_get_contents($my_url,null,null); 
3

Vous êtes essentiellement tenu d'envoyer des informations à la demande.

Essayez ceci,

$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

+1

Cela a fonctionné pour moi aussi! On dirait qu'il a besoin d'un agent utilisateur – bryan

+1

Cela fonctionne pour moi aussi, merci! – Fwolf

Questions connexes