PHP file_get_contents () restituisce "Impossibile aprire il flusso: richiesta HTTP non riuscita!"


91

Ho problemi a chiamare un URL dal codice PHP. Devo chiamare un servizio utilizzando una stringa di query dal mio codice PHP. Se digito l'URL in un browser, funziona bene, ma se utilizzo file-get-contents () per effettuare la chiamata, ottengo:

Attenzione: file-get-content (http: // ....) non è riuscito ad aprire il flusso: richiesta HTTP non riuscita! 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 devo chiamare contenga un secondo http://?

Risposte:


110

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

?>

10
Questo è troppo complicato quando il vero problema risiede nelle e commerciali.
Christian

1
@Christian, puoi approfondire?
vonUbisch

4
Non tutti hanno (ma dovrebbero) cURL installato. cURL è sicuramente molte volte più veloce, ma nemmeno file_get_contents è così lento e non richiede che tu ricordi tutte le opzioni ogni volta che lo usi.
Christian

1
Questo è CURLOPT_USERAGENTstato molto importante nel mio caso, grazie!
emotality

Credo che il mio problema fosse il timeout e questo lo ha risolto. Grazie!
evadecaptcha


23
<?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: php.net/manual/en/ref.curl.php Il problema principale è che la chiamata alla funzione get_urldovrebbe essere in realtà da get_fcontentquando hai cambiato il nome della funzione stessa. Questa è in realtà una chiamata di funzione ricorsiva che riprova a ottenere il contenuto dell'URL modificando alcuni parametri.
SSH questo

avete capito bene! stava cercando di https e veniva rifiutato. l'hai inchiodato. UPVOTED;)
tony gil

21

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

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


Non importa, ho appena notato che ha detto di file_get_contents()lavorare su un URL diverso. Tuttavia, questo è ancora un buon suggerimento per gli altri che hanno questo problema.
Michael Wales

sì, ho esaminato altre opzioni e ho visto che cURL è il modo standard di procedere, ma l'ho provato perché era più semplice e ha lavorato con altri URL, penso di dover riavviare apache per intsall cURL? e non riesco a capire come farlo (un'altra domanda) ... grazie per la tua rapida risposta
undefined

11

Fondamentalmente è necessario 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


2
Questo ha funzionato anche per me! Sembra che servisse un programma utente
bryan

Se l'URL sembra codificato correttamente, questo potrebbe essere il problema. Alcuni siti limiteranno "User-Agent", forse anche "Accetta".
Jahmic

1
super risposta. votare per promuovere questo in alto. tutto in php e ha funzionato anche per la richiesta https. solo due righe di codice in più. cosa succede se il server condiviso fornisce curl? questo è molto utile.
ndasusers

9

Ho notato che il tuo URL contiene spazi. Penso che di solito sia una cosa negativa. 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.


4

Ho 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_urlincludi gli spazi bianchi. L'ho risolto usando trim($this->video_url).

Forse ti aiuterà . In bocca al lupo


3

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

Prova a urlencode () l'url.


grazie - questi sono parametri per l'istanza mediaplug. Se codifico l'URL l'URL continua a non funzionare - ricevo un URL molto confuso nell'errore ... ??
undefined

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

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

2

Ho un problema simile.

A causa del timeout!

Il timeout può essere indicato in questo modo:

$options = array(
    'http' => array(
        'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
        'method'  => "POST",
        'content' => http_build_query($data2),
        'timeout' => 30,
    ),
);
$context = stream_context_create($options); $retour =
$retour = @file_get_contents("http://xxxxx.xxx/xxxx", false, $context);

lol che ha risolto il mio problema, grazie mille!
Niggo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.