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?

tidak terdefinisi
sumber

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

?>
James Hall
sumber
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

Mungkinkah ini masalahmu?

Catatan: Jika Anda membuka URI dengan karakter khusus, seperti spasi, Anda perlu mengenkode URI dengan urlencode ().

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


?>
pangeli
sumber
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.

Michael Wales
sumber
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

d_bhatnagar
sumber
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.

ramping
sumber
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

Emre Karataşoğlu
sumber
3

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

Coba urlencode () url.

alexn
sumber
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')));
Sergey
sumber
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);
Jerry
sumber
lol yang memperbaiki masalah saya, terima kasih banyak!
Niggo
-3

Gunakan ini

file_get_contents($my_url,null,null);
Amit Chawla
sumber