PHP cURL बनाम file_get_contents


111

REST API एक्सेस करते समय कोड के ये दो टुकड़े कैसे भिन्न होते हैं?

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

तथा

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

वे दोनों एक ही परिणाम का उत्पादन करते हैं, जिसे देखते हुए

print_r(json_decode($result))

2
cURLसे बहुत अधिक सक्षम है file_get_contents। इतना काफी होना चाहिए।

18
FWIW गति के संबंध में बहुत कम अंतर है। मैंने अभी 5,000 URL प्राप्त किए हैं और अपने HTML को फ़ाइलों (लगभग 200k प्रति फ़ाइल) को सहेज रहा है। मैंने कर्ल के साथ आधा और एक प्रयोग के रूप में file_get_contents के साथ आधा किया और कोई अंतर नहीं था।
डेविड गिल्बर्टन

8
जब तक आप एक ऐसे संस्करण का उपयोग कर रहे हैं, जो स्ट्रीम संदर्भ का समर्थन करता है, file_get_contents के साथ पोस्ट डेटा भेजना संभव है।
क्रिस स्ट्राइकलैंड

जवाबों:


129

file_get_contents()एक साधारण पेचकश है। सरल GET अनुरोधों के लिए बढ़िया जहां हेडर, HTTP अनुरोध विधि, टाइमआउट, कुकीजर, रीडायरेक्ट और अन्य महत्वपूर्ण चीजें मायने नहीं रखती हैं।

fopen()एक धारा के संदर्भ के साथ या सेटटॉप के साथ cURL हर बिट और विकल्प के साथ पावरड्रिल हैं जिनके बारे में आप सोच सकते हैं।


17
उस रूपक के भीतर रहने के लिए, ध्यान दें कि cURL एक जटिल ड्रिल चक के साथ एक पावरड्रिल है, जिसे आपको वास्तव में इसे बदलने के लिए बहुत अच्छी तरह से जानने की आवश्यकता है (पढ़ें: cURL विकल्प सेट करना थोड़ा थकाऊ है, लेकिन आपको ऐसा करने की अनुमति देता है)।
पोक

20
file_get_contentsसंदर्भ को सेट करने की भी अनुमति देता है, जिसका अर्थ है कि आप जैसे चाहें हेडर फ़ील्ड सेट कर सकते हैं।
velop

4
और @ velop की टिप्पणी के अलावा, स्ट्रीम संदर्भ के माध्यम से POST, PUT, प्रमाणीकरण, हेडर, कंटेंट, प्रॉक्सी, और एक फ़ाइल_get_contents अनुरोध के साथ और भी बहुत कुछ भेजना संभव है
Markus Köhler

@ उल्टा: हाँ। और विधि, भी। और पुनर्निर्देश करता है। और टाइमआउट ... php.net/manual/en/context.http.php
Sz।

25

इसके अतिरिक्त, कुछ हालिया वेबसाइट हैक के कारण हमें अपनी साइटों को अधिक सुरक्षित करना पड़ा। ऐसा करते हुए, हमने पता लगाया कि file_get_contents काम करने में विफल रहा, जहां कर्ल अभी भी काम करेगा।

100% नहीं, लेकिन मेरा मानना ​​है कि यह php.ini सेटिंग file_get_contents के अनुरोध को अवरुद्ध कर रही है ।

; Disable allow_url_fopen for security reasons
allow_url_fopen = 0

किसी भी तरह से, हमारा कोड अब कर्ल के साथ काम करता है ।


9
हां, सच्चाई होनी file_get_contentsचाहिए allow_url_fopen
कोस्टा

2
हां, कई होस्टिंग कंपनियां file_get_contents()कई ऐसे कारनामों के कारण अक्षम हैं जो फ़ंक्शन का उपयोग करने के लिए जाने जाते हैं। CURL फ़ंक्शन है जिसे लोग अब कोड में उपयोग कर रहे हैं।
frustratedtech

15
@frustratedtech क्या "कारनामे" ये हैं?
rdlowrey

3
होस्टिंग कंपनियाँ अक्षम कर देती हैं allow_url_fopenक्योंकि वे इसके लिए गलती करते हैं allow_url_includeallow_url_fopenऔर file_get_contentsउपयोग करने के लिए ठीक हैं।
fritzmg

2
@vr_driver उन लिंक्स से कोई लेना-देना नहीं हैfile_get_contents()
rdlowrey

19

यह पुराना विषय है लेकिन मेरे एक एपीआई पर मेरे अंतिम परीक्षण पर, CURL तेज और अधिक स्थिर है। कभी-कभी बड़े अनुरोध पर file_get_contents को 5 सेकंड से अधिक की आवश्यकता होती है जब cURL को केवल 1.4 से 1.9 सेकंड की आवश्यकता होती है जो दोगुना तेज होता है।

मुझे इस पर एक नोट जोड़ने की आवश्यकता है कि मैं सिर्फ GET भेजता हूं और JSON सामग्री पुन: प्राप्त करता हूं। यदि आप cURL को ठीक से सेटअप करते हैं, तो आपके पास एक शानदार प्रतिक्रिया होगी। सिर्फ "बताने" के लिए क्या आपको भेजने की आवश्यकता है और आपको क्या करने की आवश्यकता है और वह यह है।

आपकी परीक्षा में मैं यह सेटअप करना चाहूंगा:

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

यह अनुरोध 0.01 सेकंड अधिकतम में डेटा लौटाएगा


1
0.1 माइक्रोसेकंड (MILIseconds का 1 / 1,000) ... मुझे विश्वास है कि मुश्किल है।
मार्क टोमलिन

हाँ। मेरे पास कुछ प्रतिक्रियाएं हैं उदाहरण के लिए ट्विलियो एपीआई फोन नंबर की जांच के लिए 0.02ms। तेज़ है।
इविज़न स्टीफन स्टिपिक

4
0.02ms = 20 माइक्रोसेकंड; आपने कहा 0.1 माइक्रोसेकंड जो सही नहीं हो सकता।
वालफ

2
इसकी तुलना में यह लगभग दोगुना file_get_contents है, इसकी पुष्टि करने के लिए मैंने अभी कुछ एपीआई कॉल किए हैं। 0.8 सेकंड के लिए file_get_contentsऔर 0.49 सेकंड के लिए curl(3 एपीआई कॉल)
जेएसपी

1
आपको अपने स्वयं के सेटअप का उपयोग करना चाहिए। तब आपके प्रश्न १.४-१.९ से ०.०१ तक होंगे;)
रौली राजन्डे १०'१
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.