PHP file_get_contents () zwraca „nie udało się otworzyć strumienia: żądanie HTTP nie powiodło się!”

91

Mam problemy z wywołaniem adresu URL z kodu PHP. Muszę zadzwonić do usługi, używając ciągu zapytania z mojego kodu PHP. Jeśli wpiszę adres URL w przeglądarce, działa dobrze, ale jeśli użyję funkcji file-get-content () do wykonania połączenia, otrzymam:

Ostrzeżenie: nie udało się otworzyć strumienia pliku-get-content (http: // ....): żądanie HTTP nie powiodło się! HTTP / 1.1 202 Zaakceptowano w ...

Kod, którego używam to:

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

Jak powiedziałem - dzwoń z przeglądarki i działa dobrze. Jakieś sugestie?

Próbowałem również z innym adresem URL, takim jak:

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

To działa dobrze ... czy to możliwe, że adres URL, który muszę wywołać, ma w sobie sekundę http://?

nieokreślony
źródło

Odpowiedzi:

111

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

?>
James Hall
źródło
11
Jest to zbyt skomplikowane, gdy prawdziwy problem leży w ampersandach.
Christian,
1
@Christian, czy możesz to rozwinąć?
vonUbisch,
4
Nie każdy ma (ale powinien) zainstalować cURL. cURL z pewnością jest wiele razy szybszy, ale file_get_contents też nie jest taki wolny i nie wymaga zapamiętywania wszystkich opcji za każdym razem, gdy go używasz.
Christian,
1
To CURLOPT_USERAGENTbyło bardzo ważne w moim przypadku, dzięki!
emocje
Myślę, że mój problem polegał na tym, że upłynął limit czasu i to go naprawiło. Dziękuję Ci!
evadecaptcha,
28

Czy to może być twój problem?

Uwaga: Jeśli otwierasz identyfikator URI ze znakami specjalnymi, takimi jak spacje, musisz zakodować identyfikator URI za pomocą urlencode ().

SilentGhost
źródło
Miałem ten sam błąd, co OP i to był mój problem - spacje w argumentach. urlencode()na parametrach GET rozwiązał problem.
Walt W
Jeśli nie chcesz korzystać z rozwiązania CURL, to działa! Użyj węzła URL w parametrach.
Aaron Gong
To jest rzeczywiste rozwiązanie tego problemu.
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
źródło
5
Dzięki za kod, wygląda na to, że dostałeś go z: php.net/manual/en/ref.curl.php Głównym problemem jest to, że wywołanie funkcji get_urlpowinno faktycznie nastąpić, get_fcontentponieważ zmieniłeś nazwę samej funkcji. W rzeczywistości jest to rekurencyjne wywołanie funkcji, które ponownie próbuje uzyskać zawartość adresu URL, zmieniając niektóre parametry.
SSH To
masz to! próbował https i został odrzucony. Udało wam się. ZGŁOSOWANO;)
tony gil
21

file_get_contents()wykorzystuje fopen()otoki, dlatego nie ma dostępu do adresów URL poprzez allow_url_fopenopcję w php.ini.

Będziesz musiał albo zmienić swój plik php.ini, aby włączyć tę opcję, albo użyć alternatywnej metody, a mianowicie cURL - zdecydowanie najpopularniejszego i, szczerze mówiąc, standardowego sposobu na osiągnięcie tego, co próbujesz zrobić.

Michael Wales
źródło
Nieważne, właśnie zauważyłem, że powiedział, że file_get_contents()działa na innym adresie URL. Niemniej jednak jest to nadal dobra wskazówka dla innych, którzy mają ten problem.
Michael Wales,
tak, spojrzałem na inne opcje i zobaczyłem, że cURL jest standardową metodą, ale próbowałem tego, ponieważ było to łatwiejsze i działało z innymi adresami URL, myślę, że muszę ponownie uruchomić apache, aby zainstalować cURL? i nie mogę dowiedzieć się, jak to zrobić (inne pytanie) ... dzięki za szybką odpowiedź
undefined
11

Zasadniczo jesteś zobowiązany do przesłania pewnych informacji z prośbą.

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 mi się udało

d_bhatnagar
źródło
2
Dla mnie to też zadziałało! Wygląda na to, że potrzebował agenta użytkownika
bryan
Jeśli adres URL wydaje się być poprawnie zakodowany, może to być problem. Niektóre witryny ograniczają się do „User-Agent”, być może także „Akceptuj”.
Jahmic
1
super odpowiedź. zagłosuj na awansowanie tego na szczyt. wszystko w php i działało również dla żądania https. tylko dwie dodatkowe linie kodu. co, jeśli współdzielony serwer zapewnia curl? To jest bardzo pomocne.
ndasusers
10

Zauważyłem, że Twój adres URL zawiera spacje. Myślę, że zwykle jest to zła rzecz. Spróbuj zakodować adres URL za pomocą

$my_url = urlencode("my url");

a potem dzwonię

file_get_contents($my_url);

i zobacz, czy masz więcej szczęścia.

szczupły
źródło
4

Mam podobny problem, przeanalizowałem URL youtube. Kod to;

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

Wtedy zdaję sobie sprawę, że $this->video_urlzawierają spacje. Rozwiązałem to za pomocą trim($this->video_url).

Może to ci pomoże. Powodzenia

Emre Karataşoğlu
źródło
3

Nie jestem pewien co do parametrów (mpaction, format), czy są określone dla strony amazonaws lub ##. ##.

Spróbuj urlencode () url.

alexn
źródło
dzięki - to są parametry instancji mediaplug. Jeśli kod urlencode url nadal nie działa - pojawia się bardzo zniekształcony adres URL w błędzie ... ??
niezdefiniowany
Powinieneś kodować tylko ciąg parametrów: „convert format” powinno być „convert% 20format” (lub alternatywnie „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')));
Siergiej
źródło
2

Mam podobny problem.

Z powodu przekroczenia limitu czasu!

Limit czasu można wskazać w następujący sposób:

$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);
Nocnik
źródło
lol, który rozwiązał mój problem, bardzo dziękuję!
Niggo
-3

Użyj tego

file_get_contents($my_url,null,null);
Amit Chawla
źródło