PHP cURL ile file_get_contents karşılaştırması


111

Bir REST API'ye erişirken bu iki kod parçası nasıl farklılık gösterir?

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

ve

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

İkisi de aynı sonucu verir.

print_r(json_decode($result))

2
cURLçok daha fazlasını yapabilir file_get_contents. O kadarı yeterli olacaktır.

18
FWIW, hız açısından çok az fark var. 5.000 URL'yi getirmeyi ve HTML'lerini dosyalara kaydetmeyi (dosya başına yaklaşık 200 bin) yeni bitirdim. Yarım curl ile yarısını file_get_contents ile bir deney olarak yaptım ve farkedilebilir bir fark yoktu.
David Gilbertson

8
Akış bağlamını destekleyen bir sürüm kullandığınız sürece, gönderi verilerini file_get_contents ile göndermek mümkündür.
Chris Strickland

Yanıtlar:


129

file_get_contents()basit bir tornavidadır. Başlığın, HTTP istek yönteminin, zaman aşımının, cookiejar, yönlendirmelerin ve diğer önemli şeylerin önemli olmadığı basit GET istekleri için idealdir.

fopen()Bir akış bağlamı veya setopt ile cURL ile aklınıza gelebilecek her bit ve seçenek ile güçlü matkaplar vardır.


17
Bu metafor içinde kalmak için, cURL'nin, onu gerçekten değiştirmek için oldukça iyi bilmenizi gerektiren karmaşık bir matkap aynasına sahip bir elektrikli matkap olduğunu unutmayın (okuyun: cURL seçeneklerini ayarlamak biraz sıkıcıdır, ancak istediğiniz her şeyi yapmaya izin verir).
sokmak

20
file_get_contentsayrıca bağlamı ayarlamanıza izin verir, bu da başlık alanlarını istediğiniz gibi ayarlayabileceğiniz anlamına gelir.
2013

4
ve @ maddelerini geliştirmek yorumuna ek olarak, dere bağlamı aracılığıyla o POST, PUT, kimlik doğrulama, başlıkları, içerik, proxy ve çok daha tek file_get_contents talep ile göndermek de mümkündür
Markus Köhler

@velop: Evet. Ve yöntem de. Ve yönlendirmeler. Ve zaman aşımı ... php.net/manual/en/context.http.php
Sz.

25

Buna ek olarak, bazı yeni web sitesi saldırıları nedeniyle sitelerimizi daha fazla güvence altına almak zorunda kaldık. Bunu yaparken, file_get_contents'ın çalışmadığını, curl'nin hala çalıştığını keşfettik .

% 100 değil, ancak bu php.ini ayarının file_get_contents isteğini engelliyor olabileceğine inanıyorum .

; Disable allow_url_fopen for security reasons
allow_url_fopen = 0

Her iki durumda da, kodumuz artık curl ile çalışıyor .


9
Evet, dürüst olmayı file_get_contentsgerektirir allow_url_fopen.
Costa

2
Evet, birçok barındırma şirketi file_get_contents(), işlevi kullandığı bilinen birçok açıktan dolayı devre dışı bırakılıyor. cURL, insanların şu anda kodda kullanması gereken işlevdir.
frustratedtech

15
@frustratedtech Bunlar ne "istismarlar"?
rdlowrey

3
Hosting şirketleri devre dışı bırakıyor allow_url_fopençünkü hata yapıyorlar allow_url_include. allow_url_fopenve file_get_contentskullanmakta sorun yok.
fritzmg

2
@vr_driver bu bağlantıların hiçbir ilgisi yokfile_get_contents()
rdlowrey

19

Bu eski bir konu ancak API'mdeki son testimde cURL daha hızlı ve daha kararlı. Bazen daha büyük istek üzerine file_get_contents, cURL'nin sadece 1,4 ila 1,9 saniyeye ihtiyaç duyduğunda, iki kat daha hızlı olan 5 saniyeden fazla süreye ihtiyaç duyar.

Buna sadece GET gönderip JSON içeriğini aldığım bir not eklemem gerekiyor. CURL'yi doğru bir şekilde kurarsanız, harika bir yanıt alırsınız. Sadece cURL'a neyi göndermeniz gerektiğini ve neyi geri almanız gerektiğini "söyleyin" ve hepsi bu.

Örneğinizde şu kurulumu yapmak istiyorum:

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

Bu istek, verileri en fazla 0,01 saniye içinde döndürecektir


1
0.1 MİKROsaniye (Milisaniyenin 1 / 1.000'i) ... Buna inanmak zor.
Mark Tomlin

Evet. 0.02ms içinde bazı yanıtlarım var, örneğin Twilio API telefon numarası kontrolü. Hızlı.
Ivijan Stefan Stipić

4
0.02ms = 20 mikrosaniye; 0.1 mikrosaniye demiştin ki bu doğru olamaz.
Çorap Örgü Makinesi Walf

2
Bu, file_get_contents onaylamak için bazı API çağrıları yaptığımdan neredeyse iki kat daha hızlı . 0,8 saniye file_get_contents& 0,49 saniye curl(3 API çağrısı)
Jsp

1
Kendi kurulumunuzu kullanmalısınız. Ardından sorgularınız
1,4-1,9 saniyeden 0,01 saniyeye
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.