क्या file_get_contents () में टाइमआउट सेटिंग है?


152

मैं file_get_contents()एक लूप में विधि का उपयोग करके लिंक की एक श्रृंखला बुला रहा हूं । प्रत्येक लिंक को संसाधित होने में 15 मिनट से अधिक समय लग सकता है। अब, मुझे इस बात की चिंता है कि क्या PHP की file_get_contents()टाइमआउट अवधि है?

यदि हाँ, तो यह एक कॉल के साथ समय निकल जाएगा और अगले लिंक पर जाएगा। मैं अगले लिंक को बिना किसी पूर्व परिष्करण के कॉल नहीं करना चाहता।

तो, कृपया मुझे बताएं कि क्या file_get_contents()कोई समयावधि है। फ़ाइल जिसमें शून्य है (असीमित) पर file_get_contents()सेट है set_time_limit()



मैंने एक ही व्यवहार का अनुभव किया है (विजुअल स्टूडियो PHP प्रोजेक्ट के अंदर एक ही "सर्वर" पर URL को क्वेरी करते समय) जो Visual Studio एक्सटेंशन के लिए PHP टूल्स का उपयोग करता है। अधिक जानकारी यहाँ
उवे कीम

ऐसा तब भी होता है जब एक ही वेबसाइट पर URL को क्वेरी करने के लिए अंतर्निहित PHP सर्वर का उपयोग किया जाता है , क्योंकि यह एक एकल-थ्रेडेड वेब सर्वर है।
उवे कीम

जवाबों:


298

डिफ़ॉल्ट टाइमआउट को default_socket_timeoutआईआई-सेटिंग द्वारा परिभाषित किया गया है , जो 60 सेकंड है। आप इसे मक्खी पर भी बदल सकते हैं:

ini_set('default_socket_timeout', 900); // 900 Seconds = 15 Minutes

टाइमआउट सेट करने का एक और तरीका, उपयोग में HTTP स्ट्रीम रैपर के HTTP संदर्भ विकल्पों के stream_context_createरूप में टाइमआउट सेट करना होगा :

$ctx = stream_context_create(array('http'=>
    array(
        'timeout' => 1200,  //1200 Seconds is 20 Minutes
    )
));

echo file_get_contents('http://example.com/', false, $ctx);

8
क्या आप https url के लिए टाइमआउट सेट करने के बारे में जानकारी दे सकते हैं?
विनय

11
यह बात पूरी तरह से काम नहीं कर रही है, यदि आपका मूल्य 1200 है, तो वास्तव में इसका 2400 है। मैं अभी इसका परीक्षण करता हूं।
TomSawyer

15
default_socket_timeout, stream_set_timeout, और stream_context_create टाइमआउट हर पंक्ति के सभी टाइमआउट रीड / राइट हैं, न कि पूरे कनेक्शन टाइमआउट।
ism

32

जैसा कि @diyism में उल्लेख किया गया है, " default_socket_timeout, stream_set_timeout, और stream_context_create टाइमआउट हर पंक्ति के सभी टाइमआउट रीड / राइट हैं, पूरे कनेक्शन टाइमआउट नहीं। " और @stewe द्वारा शीर्ष उत्तर ने मुझे विफल कर दिया है।

उपयोग करने के विकल्प के रूप में file_get_contents, आप हमेशा curlटाइमआउट के साथ उपयोग कर सकते हैं ।

तो यहाँ एक काम कोड है जो लिंकिंग के लिए काम करता है।

$url='http://example.com/';
$ch=curl_init();
$timeout=5;

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);

$result=curl_exec($ch);
curl_close($ch);
echo $result;

1
यह उत्तर कनेक्ट टाइमआउट ( fsockopenइसके बजाय का उपयोग करके curl) को नियंत्रित करने के लिए एक और दृष्टिकोण देता है : stackoverflow.com/a/3690321/1869825
स्टेवो

2
आपको CURLOPT_CONNECTTIMEOUT और CURLOPT_TIMEOUT दोनों को कर्ल में सेट करना चाहिए। देखें stackoverflow.com/a/27776164/1863432
bhelm

2
एक वैध प्रतिक्रिया नहीं है, सवाल "file_get_contents" के लिए है। प्रतिक्रिया बहुत अच्छी है लेकिन अप्रभावी है।
ई-इन्फोरमिया २

8

हाँ! तीसरे पैरामीटर में एक स्ट्रीम संदर्भ पास करके :

1s के टाइमआउट के साथ यहां :

file_get_contents("https://abcedef.com", 0, stream_context_create(["http"=>["timeout"=>1]]));

Https://www.php.net/manual/en/function.file-get-contents.php के टिप्पणी अनुभाग में स्रोत

HTTP संदर्भ विकल्प :

method
header
user_agent
content
request_fulluri
follow_location
max_redirects
protocol_version
timeout

अन्य संदर्भ: https://www.php.net/manual/en/context.php


1
286 प्रतिनिधि के साथ जवाब काम नहीं किया, लेकिन तुम्हारा किया :)
VE7JRO

टाइमआउट में दिए गए stream_context_createकेवल कनेक्शन समयबाह्य के लिए काम करता है। यदि सर्वर दिए गए टाइमआउट के भीतर उत्तर देता है (कुछ डेटा भेजता है), लेकिन अपने शेष पेलोड को भेजने के लिए हमेशा के लिए लेता है, तो यह टाइमआउट धीमा हस्तांतरण को बाधित नहीं करता है।
z80crew

6

यह ध्यान देने योग्य है कि यदि मक्खी पर default_socket_timeout बदलते हैं, तो आपके file_get_contents कॉल के बाद इसके मूल्य को पुनर्स्थापित करने के लिए उपयोगी हो सकता है :

$default_socket_timeout = ini_get('default_socket_timeout');
....
ini_set('default_socket_timeout', 10);
file_get_contents($url);
...
ini_set('default_socket_timeout', $default_socket_timeout);

1
लेकिन आप जानते हैं कि ini_set स्थायी रूप से चीजों को सेट नहीं करता है, है ना? इसलिए मूल रूप से आपकी स्क्रिप्ट का 4 आधा हिस्सा बेकार है
फ्लैश थंडर

2
@FlashThunder नहीं तो बाद में उस कोड में file_get_contents के लिए एक और कॉल है जिसे पिछले टाइमआउट की आवश्यकता है। कोड को निष्पादित करने के बाद एक विशिष्ट बिट कोड के लिए मक्खी पर बहाल सेटिंग्स बदल जाती हैं, आमतौर पर अच्छा अभ्यास होता है।
लेह बिकनेल

1
@FlashThunder एक कॉल के बाद सॉकेट_टाइम मान को पुनर्स्थापित करने के लिए यह अच्छा अभ्यास है ताकि एक ही स्क्रिप्ट निष्पादन में समान फ़ंक्शन के बाद के कॉल वैश्विक सेटिंग्स का उपयोग करें।
पास्कल रोजेट

1

मेरे होस्ट में मेरे php.ini बदलने पर मेरे लिए काम करें:

; Default timeout for socket based streams (seconds)
default_socket_timeout = 300
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.