Bagaimana cara mengirim permintaan GET dari PHP?

280

Saya berencana menggunakan PHP untuk persyaratan sederhana. Saya perlu mengunduh konten XML dari URL, dan saya perlu mengirim permintaan GET HTTP ke URL itu.

Bagaimana saya melakukannya di PHP?

Veera
sumber

Jawaban:

379

Kecuali Anda membutuhkan lebih dari sekadar isi file, Anda dapat menggunakannya file_get_contents.

$xml = file_get_contents("http://www.example.com/file.xml");

Untuk hal yang lebih kompleks, saya akan menggunakan CURL .

Sasha Chedygov
sumber
3
Ini benar, kecuali jika Anda perlu menggunakan parameter string kueri.
Raptor
2
@musicfreak: string kueri terkadang diabaikan oleh beberapa server untuk pengaturan keamanan. juga, permintaan lintas-server dapat menyebabkan kesalahan ini:failed to open stream: HTTP request failed!
Raptor
26
@ ShivanRaptor: Saya tidak yakin apa yang Anda bicarakan ... String kueri hanyalah bagian dari string. Tidak ada alasan server akan mengabaikannya. Sekarang, tentu saja, file_get_contentsjangan biarkan Anda mengajukan permintaan dengan cookie khusus, tajuk, dan hal-hal lain yang biasanya dikirimkan oleh peramban, sehingga Anda mungkin tidak mendapatkan respons yang Anda cari. Dalam hal ini, Anda akan lebih baik menggunakan CURL. (Tapi itu bukan kasus OP.)
Sasha Chedygov
1
Curl jauh lebih cepat daripada file_get_contents. Pilih Curl daripada file_get_contents di lingkungan lalu lintas tinggi
Deb
2
@Sasha - Saya telah menghadapi ini di banyak lingkungan produksi tetapi Anda dapat melihat tautan ini untuk saat ini: haltiko.blogspot.com/2013/02/… atau mdb9.wordpress.com/2011/03/06/…
Deb
132

Untuk permintaan GET / POST yang lebih maju, Anda dapat menginstal perpustakaan CURL ( http://us3.php.net/curl ):

$ch = curl_init("REMOTE XML FILE URL GOES HERE"); // such as http://example.com/example.xml
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 0);
$data = curl_exec($ch);
curl_close($ch);
James Skidmore
sumber
10
Meskipun sebenarnya tidak perlu menggunakan CURL untuk "persyaratan sederhana", +1, karena itu benar-benar solusi terbaik untuk melakukan sesuatu yang lebih maju dengan permintaan HTTP di PHP.
xyz
Seperti yang telah disebutkan, keriting jauh lebih cepat daripada file_get_contents(). Sebuah string 4 huruf sederhana membutuhkan waktu sekitar 10 detik dengan itu, sementara curl mengambil lebih masuk akal ~ maks 1 detik.
Peter Gordon
@pgmann, apakah Anda yakin dengan hasil itu? ini tidak sejalan dengan statistik lain dengan apa yang telah dikutip. Memang, CURL lebih cepat, tetapi seharusnya tidak terlalu cepat. Mungkin penurunan dalam waktu respons ini berasal dari caching sisi server dari beberapa sumber daya, dll? Mungkin Anda harus mengulang tesnya?
Rauni Lillemets
1
@Rauni Saya khawatir saya tidak bisa menguji ulang tetapi saya selalu menggunakan cURL untuk peningkatan kecepatan, dll. Waktu permintaannya perkiraan, seperti apa rasanya saat memuat halaman. Saya sudah mencoba beberapa kali.
Peter Gordon
63

http_getharus melakukan trik. Keuntungan http_getlebih file_get_contentsmencakup kemampuan untuk melihat tajuk HTTP, mengakses detail permintaan, dan mengontrol batas waktu koneksi.

$response = http_get("http://www.example.com/file.xml");
William Brendel
sumber
83
Ekstensi http tidak dibundel dengan PHP dan seringkali tidak tersedia di host bersama.
Imran
27
ini membutuhkan pecl_http> = 0.1.0, yang tidak diinstal secara default.
Raptor
5
"Halaman manual yang Anda cari ( us2.php.net/manual/en/function.http-get.php ) tidak tersedia di server ini sekarang."
Pang
20

Ingat bahwa jika Anda menggunakan proxy, Anda perlu melakukan sedikit trik dalam kode php Anda:

(PROXY WITHOUT AUTENTICATION EXAMPLE)

<?php
$aContext = array(
    'http' => array(
        'proxy' => 'proxy:8080',
        'request_fulluri' => true,
    ),
);
$cxContext = stream_context_create($aContext);

$sFile = file_get_contents("http://www.google.com", False, $cxContext);

echo $sFile;
?>
pepe
sumber
9

Bergantung pada apakah pengaturan php Anda memungkinkan fopen pada URL, Anda juga bisa membuka URL dengan argumen get dalam string (seperti http://example.com?variable=value )

Sunting: Membaca kembali pertanyaan Saya tidak yakin apakah Anda ingin meneruskan variabel atau tidak - jika Anda tidak, Anda dapat mengirim permintaan fopen containg http://example.com/filename.xml - jangan ragu untuk mengabaikan bagian variabel = nilai

Zxaos
sumber
5

Saya suka menggunakan fsockopen terbuka untuk ini.

pbreitenbach
sumber
5

Di sisi lain, menggunakan REST API dari server lain sangat populer di PHP. Misalkan Anda mencari cara untuk mengarahkan kembali beberapa permintaan HTTP ke server lain (misalnya mendapatkan file xml). Ini adalah paket PHP untuk membantu Anda:

https://github.com/romanpitak/PHP-REST-Client

Jadi, dapatkan file xml:

$client = new Client('http://example.com');
$request = $client->newRequest('/filename.xml');
$response = $request->getResponse();
echo $response->getParsedResponse();
Mostafa
sumber
5

Guzzle adalah perpustakaan yang sangat terkenal yang membuatnya sangat mudah untuk melakukan semua jenis panggilan HTTP. Lihat https://github.com/guzzle/guzzle . Instal dengan composer require guzzlehttp/guzzledan jalankan composer install. Sekarang kode di bawah ini sudah cukup untuk panggilan http.

$client = new \GuzzleHttp\Client();
$response = $client->get('https://example.com/path/to/resource');

echo $response->getStatusCode();
echo $response->getBody();
Mark Baaijens
sumber