PHP file_get_contents () restituisce "imansible aprire lo stream: richiesta HTTP fallita!"

Sto avendo problemi a call un url dal codice PHP. Devo call un servizio usando una string di query dal mio codice PHP. Se scrivo l'url in un browser, funziona bene, ma se uso file-get-contents () per effettuare la chiamata, ottengo:

Attenzione: 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 detto – chiama dal browser e funziona bene. Eventuali suggerimenti?

Ho anche provato con un altro URL come:

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

Funziona bene … potrebbe essere che l'url che ho bisogno di call abbia un secondo http:// in esso?

Prova a usare 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); ?> 

Questo potrebbe essere il tuo problema?

Nota: se stai aprendo un URI con caratteri speciali, come spazi, devi codificare l'URI con urlencode ().

 <?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 arrays( $content, $response ); } } ?> 

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

Dovrai o modificare il tuo php.ini per triggersre questa opzione o utilizzare un metodo alternativo, vale a dire cURL , di gran lunga il modo più popolare e, ad essere onesto, standard per realizzare ciò che stai cercando di fare.

Ho notato che il tuo URL ha spazi in esso. Penso che di solito sia una brutta cosa. Prova a codificare l'URL con

 $my_url = urlencode("my url"); 

e poi chiamando

 file_get_contents($my_url); 

e vedi se hai più fortuna.

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

Prova a urlencode () l'url.

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_arrays ( $video_info ) ? $video_info ['feed'] ['entry'] [0] ['title'] ['$t'] : ''; 

Poi mi rendo conto che $this->video_url include lo spazio bianco. Ho risolto questo usando trim($this->video_url) .

Forse ti aiuterà . In bocca al lupo

In pratica, è necessario submit alcune informazioni con la richiesta.

Prova questo,

 $opts = arrays('http'=>arrays('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

Usa questo

 file_get_contents($my_url,null,null);