PHP file_get_contents () mengembalikan "gagal membuka aliran: permintaan HTTP gagal!"


91

Saya mengalami masalah memanggil url dari kode PHP. Saya perlu memanggil layanan menggunakan string kueri dari kode PHP saya. Jika saya mengetik url ke browser, itu berfungsi dengan baik, tetapi jika saya menggunakan file-get-content () untuk melakukan panggilan, saya mendapatkan:

Peringatan: file-get-content (http: // ....) gagal membuka aliran: permintaan HTTP gagal! HTTP / 1.1 202 Diterima di ...

Kode yang saya gunakan adalah:

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

Seperti saya katakan - panggilan dari browser dan berfungsi dengan baik. Ada saran?

Saya juga mencoba dengan url lain seperti:

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

Ini berfungsi dengan baik ... mungkinkah url yang perlu saya hubungi memiliki satu detik http://di dalamnya?

Jawaban:


111

Coba gunakan 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
Ini terlalu rumit ketika masalah sebenarnya terletak pada ampersand.
Christian

1
@Christian, bisakah Anda menjelaskan?
vonUbisch

4
Tidak semua orang memiliki (tetapi seharusnya) cURL diinstal. cURL memang jauh lebih cepat, tetapi file_get_contents juga tidak terlalu lambat, dan tidak mengharuskan Anda mengingat semua opsi setiap kali Anda menggunakannya.
Kristen

1
Ini CURLOPT_USERAGENTsangat penting dalam kasus saya, terima kasih!
emosionalitas

Saya yakin masalah saya adalah dengan waktu habis dan ini memperbaikinya. Terima kasih!
evadecaptcha

28

Saya memiliki kesalahan yang sama dengan OP, dan ini adalah masalah saya - spasi dalam argumen. urlencode()pada parameter GET memecahkan masalah.
Walt W

Jika Anda tidak ingin menggunakan solusi CURL, yang ini berhasil! Gunakan URLecnode pada parameter.
Aaron Gong

Ini adalah solusi sebenarnya untuk masalah ini.
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
Terima kasih untuk kodenya, sepertinya Anda mendapatkannya dari: php.net/manual/en/ref.curl.php Masalah utamanya adalah pemanggilan fungsi get_urlseharusnya get_fcontentkarena Anda mengubah nama fungsi itu sendiri. Ini sebenarnya adalah panggilan fungsi rekursif yang mencoba kembali untuk mendapatkan konten URL dengan mengubah beberapa parameter.
SSH Ini

Anda mengerti! mencoba https dan ditolak. kamu berhasil. DIUPVOTED;)
tony gil

21

file_get_contents()menggunakan fopen()pembungkusnya, oleh karena itu dibatasi dari mengakses URL melalui allow_url_fopenopsi dalam php.ini.

Anda harus mengubah php.ini Anda untuk mengaktifkan opsi ini atau menggunakan metode alternatif, yaitu cURL - sejauh ini merupakan cara yang paling populer dan, sejujurnya, standar untuk mencapai apa yang Anda coba lakukan.


Lupakan, baru perhatikan katanya file_get_contents()bekerja di URL yang berbeda. Meskipun demikian, ini masih merupakan tip yang bagus untuk orang lain yang mengalami masalah ini.
Michael Wales

ya, saya telah melihat opsi lain dan melihat bahwa cURL adalah cara standar untuk pergi tetapi saya mencoba ini karena lebih mudah dan bekerja dengan url lain, saya pikir saya harus me-restart apache ke intsall cURL? dan tidak tahu bagaimana melakukan ini (pertanyaan lain) ... terima kasih atas tanggapan cepat Anda
tidak ditentukan

11

Anda pada dasarnya diminta untuk mengirim beberapa informasi dengan permintaan tersebut.

Coba ini,

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

Ini berhasil bagi saya


2
Ini berhasil juga untuk saya! Sepertinya ini membutuhkan agen pengguna
bryan

Jika url tampaknya dikodekan dengan benar, ini mungkin masalahnya. Beberapa situs akan membatasi 'Agen-Pengguna', mungkin juga 'Terima'.
Jahmic

1
jawaban super. pilih untuk mempromosikan yang satu ini ke atas. semua dalam php dan bekerja untuk permintaan https juga. hanya dua kode baris tambahan. bagaimana jika server bersama menyediakan curl? ini sangat membantu.
ndasusers

10

Saya melihat bahwa URL Anda memiliki spasi di dalamnya. Saya pikir itu biasanya hal yang buruk. Coba encoding URL dengan

$my_url = urlencode("my url");

dan kemudian menelepon

file_get_contents($my_url);

dan lihat apakah Anda lebih beruntung.


4

Saya mendapat masalah serupa, saya mengurai url youtube. Kode tersebut adalah;

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

Kemudian saya menyadari bahwa itu $this->video_urltermasuk spasi. Saya menyelesaikannya dengan menggunakan trim($this->video_url).

Mungkin itu akan membantu Anda. Semoga berhasil


3

Saya tidak yakin tentang parameternya (mpaction, format), jika ditentukan untuk halaman amazonaws atau ##. ##.

Coba urlencode () url.


terima kasih - ini adalah params untuk contoh mediaplug. Jika saya urlencode url itu masih tidak berfungsi - Saya mendapatkan url yang sangat kacau dalam kesalahan ... ??
tidak ditentukan

Anda harus mengenkode hanya string parameter: "format konversi" harus "format konversi% 20" (atau alternatifnya "konversi + 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

Saya punya masalah serupa.

Karena batas waktu!

Batas waktu dapat ditunjukkan seperti ini:

$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 yang memperbaiki masalah saya, terima kasih banyak!
Niggo

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.