2009-03-30 10 views
58

Ich habe Probleme beim Aufruf einer URL aus PHP-Code. Ich muss einen Dienst aufrufen, indem ich eine Abfragezeichenfolge aus meinem PHP-Code verwende. Wenn ich die URL in einen Browser eintippe, funktioniert es einwandfrei, aber wenn ich file-get-contents() verwende, um den Anruf zu tätigen, bekomme ich:PHP file_get_contents() gibt "Fehler beim Öffnen des Streams: HTTP-Anfrage fehlgeschlagen!"

Warnung: file-get-contents (http: // ....) konnte den Stream nicht öffnen: HTTP-Anfrage fehlgeschlagen! in HTTP/1.1 202 Accepted ...

Der Code I bin mit:

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

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

Ich habe auch mit einer anderen URL versucht, wie zum Beispiel:

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

Dies funktioniert gut ... könnte es sein, dass die URL ich anrufen müssen, um eine zweite http:// in ihm hat?

Antwort

85

Verwenden Sie 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

Dies ist viel zu kompliziert, wenn das eigentliche Problem in kaufmännisches und-Zeichen liegt. – Christian

+0

@Christian, kannst du es ausarbeiten? – vonUbisch

+4

Nicht jeder hat (aber sollte) cURL installiert haben. cURL ist sicher um ein Vielfaches schneller, aber file_get_contents ist auch nicht * langsam * und erfordert nicht, dass Sie sich bei jeder Verwendung an alle Optionen erinnern. – Christian

2

Ich bin nicht sicher über die Parameter (mpaction, Format), wenn sie für die amazonaws Seite oder ##. ## angegeben sind.

Versuchen Sie urlencode() die URL.

+0

Dank für mich aus - diese params für die mediaplug Instanz sind. Wenn ich die URL urlencode es funktioniert immer noch nicht - ich bekomme eine sehr unleserliche URL in den Fehler ... ?? – undefined

+0

welche Art von Fehler? urlencode verstümmelt URL nicht. – SilentGhost

+0

Sie sollten nur den Parameter string kodieren: "convert format" sollte "convert% 20format" sein (oder alternativ "convert + format"). – bobince

20
+0

Ich hatte den gleichen Fehler der OP hatte, und das war mein Problem - Leerzeichen in den Argumenten. 'urlencode()' auf den GET-Parametern löste das Problem. –

+0

Wenn Sie die CURL-Lösung nicht verwenden möchten, funktioniert diese! Verwenden Sie den URLecnode für die Parameter. –

+0

Ohhh mann danke viel – Umair

5

ich feststellen, dass Ihre URL Leerzeichen enthält. Ich denke, das ist normalerweise eine schlechte Sache. Versuchen Sie, die URL-Codierung mit

$my_url = urlencode("my url"); 

und dann

file_get_contents($my_url); 

aufrufen und sehen, ob Sie mehr Glück haben.

16

file_get_contents() verwendet die Wrapper fopen(), daher ist der Zugriff auf URLs über die Option allow_url_fopen innerhalb von php.ini nicht möglich.

Sie müssen entweder Ihre php.ini ändern, um diese Option einzuschalten, oder eine alternative Methode verwenden, nämlich cURL - bei weitem die beliebteste und, ehrlich gesagt, Standardmethode, um das zu erreichen, was Sie versuchen zu tun.

+0

Nevermind, bemerkte gerade er sagte 'file_get_contents()' arbeitete an einer anderen URL. Nichtsdestotrotz ist dies immer noch ein guter Tipp für andere, die dieses Problem haben. –

+0

Ja, ich habe mir andere Optionen angeschaut und gesehen, dass cURL der Standard Weg ist, aber ich habe es ausprobiert, da es einfacher war und mit anderen URLs funktioniert. Ich denke, ich muss Apache auf Intsall CURL neu starten? und kann nicht herausfinden, wie man das macht (eine andere Frage) ... Danke für Ihre schnelle Antwort – 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

Danke für den Code, sieht aus wie Sie es bekommen haben: http://php.net/manual/en/ref.curl.php Das Hauptproblem ist der Funktionsaufruf 'get_url' sollte eigentlich' get_fcontent' sein, da Sie den Name der Funktion selbst Dies ist ein rekursiver Funktionsaufruf, der versucht, den URL-Inhalt durch Ändern einiger Parameter wiederherzustellen. –

+0

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

2

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 merke ich, dass $this->video_url die Leerzeichen enthalten. Ich löste das mit trim($this->video_url).

Vielleicht wird es Ihnen helfen.Luck Gut

-3

verwenden

file_get_contents($my_url,null,null); 
3

Sie grundsätzlich erforderlich sind einige Informationen mit der Anfrage zu senden.

die Sie interessieren,

$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 funktionierte

+1

Das hat auch für mich funktioniert! Sieht so aus als ob es einen User Agent benötigt – bryan

+1

Das funktioniert auch für mich, danke! – Fwolf

Verwandte Themen