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://?

nicht definiert
quelle

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

?>
James Hall
quelle
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

Könnte das dein Problem sein?

Hinweis: Wenn Sie eine URI mit Sonderzeichen wie Leerzeichen öffnen, müssen Sie die URI mit urlencode () codieren.

SilentGhost
quelle
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 );
    }
}


?>
Pangeli
quelle
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.

Michael Wales
quelle
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

d_bhatnagar
quelle
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.

schlank
quelle
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

Emre Karataşoğlu
quelle
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 () .

alexn
quelle
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')));
Sergey
quelle
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);
Jerry
quelle
lol das hat mein Problem behoben, vielen Dank!
Niggo
-3

Benutze das

file_get_contents($my_url,null,null);
Amit Chawla
quelle