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

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

?>

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

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


?>

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ć.


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


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.


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


3

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

Spróbuj urlencode () url.


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

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

lol, który rozwiązał mój problem, bardzo dziękuję!
Niggo

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.