PHP cURL vs file_get_contents

111

Apa perbedaan kedua kode ini saat mengakses REST API?

$result = file_get_contents('http://api.bitly.com/v3/shorten?login=user&apiKey=key&longUrl=url');

dan

$ch = curl_init('http://api.bitly.com/v3/shorten?login=user&apiKey=key&longUrl=url');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);

Keduanya menghasilkan hasil yang sama, dilihat dari

print_r(json_decode($result))
Salvador Dali
sumber
2
cURLmampu lebih dari file_get_contents. Itu sudah cukup.
18
FWIW Ada sedikit perbedaan dalam hal kecepatan. Saya baru saja selesai mengambil 5.000 URL dan menyimpan HTML-nya ke file (sekitar 200k per file). Saya melakukan setengah dengan curl dan setengah dengan file_get_contents sebagai percobaan dan tidak ada perbedaan yang terlihat.
David Gilbertson
8
Anda dapat mengirim data posting dengan file_get_contents, selama Anda menggunakan versi yang mendukung konteks streaming.
Chris Strickland

Jawaban:

129

file_get_contents()adalah obeng sederhana. Sangat bagus untuk permintaan GET sederhana di mana header, metode permintaan HTTP, batas waktu, cookiejar, pengalihan, dan hal penting lainnya tidak menjadi masalah.

fopen()dengan konteks aliran atau cURL dengan setopt adalah latihan daya dengan setiap bit dan opsi yang dapat Anda pikirkan.

Xeoncross
sumber
17
Untuk tetap berada dalam metafora itu, perhatikan bahwa cURL adalah powerdrill dengan bor chuck rumit yang mengharuskan Anda mengetahuinya dengan cukup baik untuk benar-benar mengubahnya (baca: menyetel opsi cURL agak membosankan, tetapi memungkinkan untuk melakukan apa pun yang Anda inginkan).
aduk
20
file_get_contentsmemungkinkan juga untuk mengatur konteks, yang berarti Anda dapat mengatur bidang header sesuka Anda.
velop
4
dan sebagai tambahan untuk komentar @ velop, melalui konteks aliran juga dimungkinkan untuk mengirim POST, PUT, otentikasi, header, konten, proxy, dan banyak lagi dengan satu permintaan file_get_contents
Markus Köhler
@ mengembangkan: Ya. Dan metode juga. Dan pengalihan. Dan batas waktu ... php.net/manual/en/context.http.php
Sz.
25

Selain itu, karena beberapa peretasan situs web baru-baru ini, kami harus lebih mengamankan situs kami. Saat melakukannya, kami menemukan bahwa file_get_contents gagal berfungsi, di mana curl masih akan berfungsi.

Tidak 100%, tapi saya yakin pengaturan php.ini ini mungkin telah memblokir permintaan file_get_contents .

; Disable allow_url_fopen for security reasons
allow_url_fopen = 0

Bagaimanapun, kode kami sekarang berfungsi dengan curl .

vr_driver
sumber
9
Ya, file_get_contentsmembutuhkan allow_url_fopenuntuk menjadi truthy.
Costa
2
Ya, banyak perusahaan hosting yang dinonaktifkan file_get_contents()karena banyak eksploitasi yang diketahui menggunakan fungsi tersebut. cURL adalah fungsi yang harus digunakan orang dalam kode sekarang.
frustratedtech
15
@frustratedtech Apa "eksploitasi" ini?
rdlowrey
3
Perusahaan hosting menonaktifkan allow_url_fopenkarena mereka salah paham allow_url_include. allow_url_fopendan file_get_contentsbaik untuk digunakan.
fritzmg
2
@vr_driver tautan tersebut tidak ada hubungannya denganfile_get_contents()
rdlowrey
19

Ini adalah topik lama tetapi pada pengujian terakhir saya pada salah satu API saya, cURL lebih cepat dan lebih stabil. Terkadang file_get_contents pada permintaan yang lebih besar membutuhkan lebih dari 5 detik ketika cURL hanya membutuhkan dari 1,4 hingga 1,9 detik yang lebih cepat dua kali lipat.

Saya perlu menambahkan satu catatan tentang ini bahwa saya baru saja mengirim GET dan menerima konten JSON. Jika Anda mengatur cURL dengan benar, Anda akan mendapatkan respon yang bagus. Cukup "beri tahu" kepada cURL apa yang perlu Anda kirim dan apa yang perlu Anda terima dan hanya itu.

Atas contoh Anda, saya ingin melakukan penyiapan ini:

$ch =  curl_init('http://api.bitly.com/v3/shorten?login=user&apiKey=key&longUrl=url');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
    curl_setopt($ch, CURLOPT_TIMEOUT, 3);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json'));
$result = curl_exec($ch);

Permintaan ini akan mengembalikan data dalam maks 0,01 detik

Ivijan Stefan Stipić
sumber
1
0,1 MICROseconds (1 / 1,000 of a MILIseconds) ... Sulit dipercaya.
Mark Tomlin
Iya. Saya punya beberapa tanggapan dalam 0,02ms misalnya cek nomor telepon Twilio API. Cepat.
Ivijan Stefan Stipić
4
0,02ms = 20 mikrodetik; Anda mengatakan 0,1 mikrodetik yang tidak benar.
Walf
2
Ini hampir dua kali lebih cepat dibandingkan dengan file_get_contents saya baru saja melakukan beberapa panggilan API untuk mengonfirmasi. 0,8 detik selama file_get_contents& 0,49 detik untuk curl(3 panggilan API)
Jsp
1
Anda harus menggunakan pengaturan Anda sendiri. Kemudian kueri Anda akan berubah dari 1,4-1,9 detik menjadi 0,01 detik;)
Rauli Rajande