PHP file_get_contents () gibt "Stream konnte nicht geöffnet werden: HTTP-Anforderung fehlgeschlagen!"


90

Ich habe Probleme beim Aufrufen einer URL aus PHP-Code. Ich muss einen Dienst mit einer Abfragezeichenfolge aus meinem PHP-Code aufrufen. Wenn ich die URL in einen Browser eingebe, funktioniert es in Ordnung, aber wenn ich file-get-content () verwende, um den Anruf zu tätigen, erhalte ich:

Warnung: Datei-Get-Inhalt (http: // ....) konnte Stream nicht öffnen: HTTP-Anfrage fehlgeschlagen! HTTP / 1.1 202 Akzeptiert in ...

Der Code, den ich benutze, ist:

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

Wie gesagt - Anruf aus dem Browser und es funktioniert gut. Irgendwelche Vorschläge?

Ich habe es auch mit einer anderen URL versucht wie:

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

Das funktioniert gut ... könnte es sein, dass die URL, die ich anrufen muss, eine Sekunde enthält http://?

Antworten:


111

Versuchen Sie es mit 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
Dies ist viel zu kompliziert, wenn das eigentliche Problem im kaufmännischen Und liegt.
Christian

1
@Christian, kannst du das näher erläutern?
vonUbisch

4
Nicht jeder hat (sollte aber sollte) cURL installiert. cURL ist sicher um ein Vielfaches schneller, aber file_get_contents ist auch nicht so langsam und erfordert nicht, dass Sie sich bei jeder Verwendung alle Optionen merken.
Christian

1
Das CURLOPT_USERAGENTwar in meinem Fall sehr wichtig, danke!
Emotionalität

Ich glaube, mein Problem war das Timeout und das hat es behoben. Danke dir!
Evadecaptcha

28

Ich hatte den gleichen Fehler wie das OP, und dies war mein Problem - Leerzeichen in den Argumenten. urlencode()auf den GET-Parametern löste das Problem.
Walt W

Wenn Sie die CURL-Lösung nicht verwenden möchten, funktioniert diese! Verwenden Sie den URL-Knoten für die Parameter.
Aaron Gong

Dies ist die eigentliche Lösung für dieses Problem.
Henrik Petterson

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
Vielen Dank für den Code. Sieht so aus, als hätten Sie ihn erhalten von: php.net/manual/en/ref.curl.php Das Hauptproblem ist, dass der Funktionsaufruf get_urltatsächlich sein sollte, get_fcontentda Sie den Namen der Funktion selbst geändert haben. Dies ist eigentlich ein rekursiver Funktionsaufruf, der erneut versucht, den URL-Inhalt durch Ändern einiger Parameter abzurufen.
SSH Dies ist der

du hast es! versuchte https und wurde abgelehnt. Du hast den Nagel auf den Kopf getroffen. UPVOTED;)
Tony Gil

21

file_get_contents()verwendet die fopen()Wrapper, daher ist der Zugriff auf URLs über die allow_url_fopenOption in der php.ini eingeschränkt.

Sie müssen entweder Ihre php.ini ändern, um diese Option zu aktivieren, oder eine alternative Methode verwenden, nämlich cURL - die mit Abstand beliebteste und, um ehrlich zu sein, Standardmethode, um das zu erreichen, was Sie versuchen.


Egal, ich habe gerade bemerkt, dass file_get_contents()er an einer anderen URL gearbeitet hat. Trotzdem ist dies immer noch ein guter Tipp für andere, die dieses Problem haben.
Michael Wales

Ja, ich habe mir andere Optionen angesehen und festgestellt, dass cURL der Standard ist, aber ich habe es versucht, da es einfacher war und mit anderen URLs gearbeitet hat. Ich denke, ich muss Apache neu starten, um cURL zu installieren. und kann nicht herausfinden, wie das geht (eine andere Frage) ... danke für Ihre schnelle Antwort
undefiniert

11

Grundsätzlich müssen Sie einige Informationen mit der Anfrage senden.

Versuche dies,

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

Das hat bei mir geklappt


2
Das hat auch bei mir funktioniert! Sieht so aus, als hätte es einen Benutzeragenten gebraucht
Bryan

Wenn die URL richtig codiert zu sein scheint, könnte dies das Problem sein. Einige Websites beschränken sich auf "User-Agent", möglicherweise auch auf "Akzeptieren".
Jahmic

1
super antwort. stimme dafür, diesen nach oben zu befördern. alles in PHP und arbeitete auch für https Anfrage. nur zwei zusätzliche Zeilen Code. Was ist, wenn ein gemeinsam genutzter Server Curl bereitstellt? das ist sehr hilfreich.
ndasusers

9

Ich stelle fest, dass Ihre URL Leerzeichen enthält. Ich denke, das ist normalerweise eine schlechte Sache. Versuchen Sie, die URL mit zu codieren

$my_url = urlencode("my url");

und dann anrufen

file_get_contents($my_url);

und sehen, ob Sie besseres Glück haben.


4

Ich habe ein ähnliches Problem, ich habe die YouTube-URL analysiert. Der Code ist;

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

Dann $this->video_urlmerke ich, dass das Leerzeichen enthalten. Ich habe das mit gelöst trim($this->video_url).

Vielleicht hilft es dir. Viel Glück


3

Ich bin mir nicht sicher über die Parameter (mpaction, format), ob sie für die amazonaws-Seite oder ##. ## angegeben sind.

Versuchen Sie, die URL urlencode () .


danke - das sind params für die mediaplug instanz. Wenn ich die URL urlencode, funktioniert es immer noch nicht - ich bekomme eine sehr verstümmelte URL im Fehler ... ??
undefiniert

Sie sollten nur die Parameterzeichenfolge codieren: "Format konvertieren" sollte "% 20format konvertieren" (oder alternativ "+ Format konvertieren") sein.
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

Ich habe ein ähnliches Problem.

Aufgrund einer Zeitüberschreitung!

Timeout kann wie folgt angezeigt werden:

$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 das hat mein Problem behoben, vielen Dank!
Niggo

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.