2009-03-30 16 views
58

Mam problem z wywołaniem adresu URL z kodu PHP. Muszę wywołać usługę przy użyciu ciągu kwerendy z mojego kodu PHP. Jeśli wpiszę URL w przeglądarce, działa dobrze, ale jeśli użyję funkcji get-content() do wykonania połączenia, otrzymam:PHP file_get_contents() zwraca "nie udało się otworzyć strumienia: żądanie HTTP nie powiodło się!"

Ostrzeżenie: plik-get-zawartość (http: // ....) nie udało się otworzyć strumienia: żądanie HTTP nie powiodło się! HTTP/1.1 202 Przyjęta ...

Kod używam jest:

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

Tak jak mówiłem - wywołanie z przeglądarki i działa dobrze. Jakieś sugestie?

Próbowałem również z innego adresu URL, takich jak:

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

Działa to dobrze ... to może być, że adres URL Muszę zadzwonić ma drugą http:// w nim?

Odpowiedz

85

Spróbuj użyć 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

Jest to zbyt skomplikowane, gdy prawdziwy problem leży w ampersandach. – Christian

+0

@ Chrześcijanin, czy możesz rozwinąć? – vonUbisch

+4

Nie każdy ma (ale powinien) zainstalowany cURL. cURL z pewnością jest wiele razy szybszy, ale file_get_contents nie jest * wolno * i nie wymaga zapamiętania wszystkich opcji za każdym razem, gdy go używasz. – Christian

2

Nie jestem pewien co do parametrów (mpakcja, format), jeśli są one określone dla strony amazonaws lub ##. ##.

Spróbuj podać adres URL pod adresem urlencode().

+0

dzięki - to params dla mediaplug instancji. Jeśli urlencode url to nadal nie działa - otrzymuję bardzo zniekształcony URL w błędzie ... ?? – undefined

+0

jakiego rodzaju błąd? urlencode nie zmienia adresu URL. – SilentGhost

+0

Powinieneś kodować tylko ciąg parametrów: "convert format" powinno być "convert% 20format" (lub alternatywnie "convert + format"). – bobince

5

Zauważyłem, że adres URL zawiera spacje w nim. Myślę, że zazwyczaj jest to złe. Spróbuj kodowania URL z

$my_url = urlencode("my url"); 

a następnie wywołanie

file_get_contents($my_url); 

i sprawdzić, czy masz więcej szczęścia.

16

file_get_contents() wykorzystuje owijki fopen(), dlatego nie ma dostępu do adresów URL poprzez opcję allow_url_fopen w pliku php.ini.

Będziesz musiał zmienić swój php.ini, aby włączyć tę opcję, lub użyć innej metody, a mianowicie cURL - zdecydowanie najbardziej popularnej i, mówiąc szczerze, standardowego sposobu wykonania tego, co próbujesz zrobić.

+0

Nieważne, właśnie zauważyłem, że powiedział 'file_get_contents()' pracował na innym URL. Niemniej jednak jest to nadal dobra wskazówka dla innych osób mających ten problem. –

+0

Tak, Ive spojrzał na inne opcje i zobaczyć, że cURL jest standardowym sposobem, aby przejść, ale próbowałem to, ponieważ było łatwiejsze i pracował z innymi adresami URL, myślę, że muszę ponownie uruchomić apache do intsall cURL? i nie mogę wymyślić, jak to zrobić (inne pytanie) ... dzięki za szybką odpowiedź – 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

Dzięki za kod, wygląda na to, że masz go: http://php.net/manual/en/ref.curl.php Głównym problemem jest wywołanie funkcji 'get_url' powinno być' get_fcontent', ponieważ zmieniłeś nazwa samej funkcji. Jest to w rzeczywistości rekurencyjne wywołanie funkcji, które ponownie próbuje uzyskać zawartość adresu URL przez zmianę niektórych parametrów. –

+0

masz to! próbował https i został odrzucony. przygwoździłeś to. UPVOTED;) –

2

mam podobny problem, analizowany url youtube. Kod jest;

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

Następnie zdaję sobie sprawę, że $this->video_url zawiera białe znaki. Rozwiązałem to przy użyciu trim($this->video_url).

Może to ci pomoże.Powodzenia

-3

Użyj tego

file_get_contents($my_url,null,null); 
3

Zasadniczo są wymagane, aby wysłać informacje o żądaniu.

Spróbuj tego,

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

To działało na mnie

+1

To działało również dla mnie! Wygląda na to, że potrzebował klienta użytkownika – bryan

+1

To działa również dla mnie, dzięki! – Fwolf

Powiązane problemy