2009-03-30 14 views
58

Ho problemi a chiamare un URL dal codice PHP. Devo chiamare un servizio usando una stringa di query dal mio codice PHP. Se digito l'url in un browser, funziona, ma se uso il file-get-contents() per effettuare la chiamata, ottengo:PHP file_get_contents() restituisce "impossibile aprire lo stream: richiesta HTTP non riuscita!"

Avviso: file-get-contents (http: // ....) non è riuscito ad aprire stream: richiesta HTTP fallita! HTTP/1.1 202 accettato in ...

Il codice che sto usando è:

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

Come ho già detto - chiamata dal browser e funziona benissimo. Eventuali suggerimenti?

Ho anche provato con un altro URL, ad esempio:

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

Questo funziona bene ... potrebbe essere che l'url ho bisogno di chiamare ha un secondo http:// in esso?

risposta

85

Provare a utilizzare 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

Questo è troppo complicato quando il vero problema si trova all'interno di e commerciali. – Christian

+0

@Christian, puoi elaborare? – vonUbisch

+4

Non tutti hanno (ma dovrebbero comunque) installato cURL. cURL è sicuramente molte volte più veloce, ma file_get_contents non è * that * slow neanche, e non richiede che tu ricordi tutte le opzioni ogni volta che lo usi. – Christian

2

Non sono sicuro dei parametri (mpaction, format), se sono specificati per la pagina amazonaws o ##. ##.

Prova a urlencode() l'url.

+0

grazie - questi sono params per l'istanza mediaplug. Se urlencode l'url non funziona ancora - ottengo un errore molto confuso nell'errore ... ?? – undefined

+0

che tipo di errore? urlencode non altera l'URL. – SilentGhost

+0

Dovresti codificare solo la stringa di parametri: "convert format" dovrebbe essere "convert% 20format" (o in alternativa "convert + format"). – bobince

5

ho notato che l'URL contiene spazi. Penso che di solito sia una brutta cosa. Prova codifica l'URL con

$my_url = urlencode("my url"); 

e quindi chiamando

file_get_contents($my_url); 

e vedere se hai più fortuna.

16

file_get_contents() utilizza i wrapper fopen(), pertanto è limitato l'accesso agli URL tramite l'opzione allow_url_fopen all'interno di php.ini.

Sarà necessario modificare il php.ini per attivare questa opzione o utilizzare un metodo alternativo, ovvero cURL - di gran lunga il modo più popolare e, per essere onesti, standard per realizzare ciò che si sta tentando di fare.

+0

Non importa, ha appena notato che ha detto che file_get_contents() 'ha funzionato su un URL diverso. Tuttavia, questo è ancora un buon suggerimento per gli altri che hanno questo problema. –

+0

sì, Ive ha esaminato altre opzioni e ha notato che cURL è il modo standard per andare ma ho provato questo perché era più semplice e ha funzionato con altri URL, penso di dover riavviare apache in intsall cURL? e non riesco a capire come fare questo (un'altra domanda) ... grazie per la tua risposta rapida – 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

Grazie per il codice, sembra che tu l'abbia preso da: http://php.net/manual/en/ref.curl.php Il problema principale è la chiamata alla funzione 'get_url' in realtà dovrebbe essere' get_fcontent' dato che hai cambiato nome della funzione stessa. Questa è in realtà una chiamata di funzione ricorsiva che tenta nuovamente di ottenere il contenuto dell'URL modificando alcuni parametri. –

+0

hai capito! stava provando a https e stava diventando rifiutato. l'hai inchiodato UPVOTED;) –

2

ho avuto un problema simile, ho analizzato l'URL di YouTube. Il codice è;

$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'] : ''; 

Poi mi rendo conto che $this->video_url includono gli spazi. Ho risolto quello usando trim($this->video_url).

Forse ti aiuterà.Buona fortuna

-3

Utilizzare questa

file_get_contents($my_url,null,null); 
3

Che, fondamentalmente, sono tenuti a inviare alcune informazioni con la richiesta.

Prova questo,

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

questo ha funzionato per me

+1

Questo ha funzionato anche per me! Sembra che ci sia bisogno di un agente utente – bryan

+1

Funziona anche per me, grazie! – Fwolf

Problemi correlati