PHP file_get_contents () dan mengatur header permintaan

121

Dengan PHP, apakah mungkin mengirim header HTTP dengan file_get_contents()?

Saya tahu Anda dapat mengirim agen pengguna dari php.inifile Anda . Namun, Anda dapat juga mengirimkan informasi lain seperti HTTP_ACCEPT, HTTP_ACCEPT_LANGUAGE, dan HTTP_CONNECTIONdengan file_get_contents()?

Atau adakah fungsi lain yang akan melakukannya?

Marcus
sumber

Jawaban:

319

Sebenarnya, setelah membaca lebih lanjut tentang file_get_contents()fungsinya:

// Create a stream
$opts = [
    "http" => [
        "method" => "GET",
        "header" => "Accept-language: en\r\n" .
            "Cookie: foo=bar\r\n"
    ]
];

$context = stream_context_create($opts);

// Open the file using the HTTP headers set above
$file = file_get_contents('http://www.example.com/', false, $context);

Anda mungkin dapat mengikuti pola ini untuk mencapai apa yang Anda cari, saya belum menguji ini secara pribadi. (dan jika tidak berhasil, silakan periksa jawaban saya yang lain)

Dominic Barnes
sumber
18
ini satu-satunya jawaban yang berguna di halaman ini
Gordon
9
Saya berharap lebih banyak orang di sini akan memberikan jawaban yang sebenarnya untuk pertanyaan ini daripada hanya menunjuk ke halaman cURL. Terima kasih.
Merijn
3
tiba-tiba penasaran: apa agen pengguna defaultnyafile_get_contents() ? apakah itu menentukan satu?
Raptor
5
@Raptor ini_set('user_agent', 'SomeBrowser v42.0.4711');buka user-agent.me dan salin milik Anda dari sana .. atau edit php.ini untuk mengubahnya secara global
jaggedsoft
88

Inilah yang berhasil bagi saya (Dominic hanya satu baris pendek).

$url = "";

$options = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Accept-language: en\r\n" .
              "Cookie: foo=bar\r\n" .  // check function.stream-context-create on php.net
              "User-Agent: Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.102011-10-16 20:23:10\r\n" // i.e. An iPad 
  )
);

$context = stream_context_create($options);
$file = file_get_contents($url, false, $context);
Fabrice
sumber
6
Anda tidak boleh meniru agen pengguna browser. Sebagai gantinya, buat string Agen-Pengguna untuk alat Anda. www-archive.mozilla.org/build/revised-user-agent-strings.html dapat memberikan gambaran tentang formatnya.
Dereckson
1
@Vince Saya pikir itu dapat bekerja dua arah dalam keadaan tertentu. Mengatur header agen seperti itu, sebagai string, berfungsi dalam kasus saya (WAF membutuhkan agen pengguna yang tidak kosong untuk meminta agar lulus)
dhaupin
3
@Vince Docs PHP menyatakan bahwa keduanya dapat digunakan dan "User-Agent" headerakan menimpa user_agentelemen array, jika keduanya ditentukan.
MrWhite
CATATAN: Jangan pernah menggunakan tanda kutip tunggal dengan string yang mengandung karakter khusus seperti \ n atau \ r. PHP tidak akan menafsirkannya dengan benar dan jika mengirim header, header Anda tidak akan dikirim dengan benar.
ak93
1
@Fanky, yang paling sederhana adalah "YourTool / 1.0.0". Saat merilis versi baru, Anda juga dapat mengubah versi agen pengguna, "AlatAnda / 1.3.5".
Dereckson
38

Anda dapat menggunakan variabel ini untuk mengambil header respons setelahnya file_get_contents() fungsi.

Kode:

  file_get_contents("http://example.com");
  var_dump($http_response_header);

Keluaran:

array(9) {
  [0]=>
  string(15) "HTTP/1.1 200 OK"
  [1]=>
  string(35) "Date: Sat, 12 Apr 2008 17:30:38 GMT"
  [2]=>
  string(29) "Server: Apache/2.2.3 (CentOS)"
  [3]=>
  string(44) "Last-Modified: Tue, 15 Nov 2005 13:24:10 GMT"
  [4]=>
  string(27) "ETag: "280100-1b6-80bfd280""
  [5]=>
  string(20) "Accept-Ranges: bytes"
  [6]=>
  string(19) "Content-Length: 438"
  [7]=>
  string(17) "Connection: close"
  [8]=>
  string(38) "Content-Type: text/html; charset=UTF-8"
}
ali_sed
sumber
6
ini tidak menjawab pertanyaan sama sekali.
Gordon
32
Mungkin tidak, tapi ini menjawab pertanyaan sebaliknya yang tersirat dalam judul, yaitu bagaimana membaca header respon dari file_get_contents. Dan di sinilah Google mendarat ketika menyelidiki pertanyaan ITU.
Rich Remer
0

Iya.

Saat memanggil file_get_contentsURL, seseorang harus menggunakanstream_create_context fungsi, yang didokumentasikan dengan cukup baik di php.net.

Ini kurang lebih persis dibahas pada halaman berikut di php.net di bagian komentar pengguna: http://php.net/manual/en/function.stream-context-create.php

Laereom
sumber
-1

Menggunakan pustaka php cURL mungkin akan menjadi cara yang tepat, karena pustaka ini memiliki lebih banyak fitur daripada yang sederhana file_get_contents(...).

Sebuah contoh:

<?php
$ch = curl_init();
$headers = array('HTTP_ACCEPT: Something', 'HTTP_ACCEPT_LANGUAGE: fr, en, da, nl', 'HTTP_CONNECTION: Something');

curl_setopt($ch, CURLOPT_URL, "http://localhost"); # URL to post to
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 ); # return into a variable
curl_setopt($ch, CURLOPT_HTTPHEADER, $header ); # custom headers, see above
$result = curl_exec( $ch ); # run!
curl_close($ch);
?>
phidah
sumber
5
Cuplikan yang Anda tunjukkan juga mudah dicapai file_get_contentsdan saya belum menemukan Kasus Penggunaan yang hanya dapat Anda capai dengan cURL.
Gordon
-2

Jika Anda tidak membutuhkan HTTPS dan curl tidak tersedia di sistem Anda, Anda dapat menggunakan fsockopen

Fungsi ini membuka koneksi dari mana Anda dapat membaca dan menulis seperti yang Anda lakukan dengan pegangan file biasa.

AlexB
sumber
2
ya, tetapi itu juga berarti OP harus mengimplementasikan protokol HTTP secara manual. Selain itu, OP tidak menanyakan tentang alternatif, file_get_contentsjadi ini agak merupakan jawaban di luar topik.
Gordon
-4

Sayangnya, sepertinya tidak file_get_contents() benar benar menawarkan tingkat kendali itu. Ekstensi cURL biasanya yang pertama muncul, tetapi saya akan sangat merekomendasikan ekstensi PECL_HTTP ( http://pecl.php.net/package/pecl_http ) untuk permintaan HTTP yang sangat sederhana dan mudah. (jauh lebih mudah untuk dikerjakan daripada cURL)

Dominic Barnes
sumber