2010-03-24 10 views
5

हे सब, मैं php निम्नलिखित स्निपेटकैसे समयबाह्य करने fopen करने के लिए ठीक से

if($fp = fopen($url, 'r')) { 
    stream_set_timeout($fp, 1); 
    stream_set_blocking($fp, 0); 

} 
$info = stream_get_meta_data($fp); 

मैं चाहता अनुरोध 1 सेकंड के बाद का समय-समाप्त करने के लिए ... अगर मैं एक नींद डाल (20) मेरे $ url में जो मैं पढ़ रहा हूं, वह पूरे 20 सेकंड तक प्रतीक्षा करता है और कभी भी बाहर नहीं जाता है। क्या फॉपेन के साथ टाइमआउट करने का कोई बेहतर तरीका है?

अगर मैं ini_set का उपयोग ('default_socket_timeout', 2); उस कोड के ठीक से यह ठीक से बाहर हो जाता है लेकिन $ जानकारी तब शून्य हो जाती है, इसलिए आदर्श रूप से मैं स्ट्रीम फ़ंक्शंस का उपयोग करना चाहता हूं।

धन्यवाद

+0

आप क्या उम्मीद करते हैं $ जानकारी जब वहाँ एक कनेक्शन समयबाह्य है होना करने के लिए? – VolkerK

उत्तर

10

आप stream_context_create() उपयोग कर सकते हैं और http context option timeout
लेकिन fopen() अभी भी अवास्तविक लौटाते हैं यदि समय समाप्त होता है और stream_get_meta_data() काम नहीं करेगा।

$url = 'http://...'; 
$context = stream_context_create(array(
    'http'=>array(
    'timeout' => 2.0 
) 
)); 
$fp = fopen($url, 'r', false, $context); 
if (!$fp) { 
    echo '!fopen'; 
} 
else { 
    $info = stream_get_meta_data($fp); 
    var_dump($info); 
} 
+0

इसके साथ एकमात्र मुद्दा यह है कि संदर्भ को php5 तक नहीं जोड़ा गया था और दुर्भाग्य से जो कोड मैं लिख रहा हूं उसे php4 संगत होने की आवश्यकता है :( – James

+1

मैनुअल PHP 4.3.0 कहता है, इसलिए आपको http: //www.php.net/manual/en/function.stream-context-create.php –

+1

मैंने अभी "टाइमआउट" की कोशिश की है, लेकिन जब मैंने टाइमआउट = 2 चुना है, तो वास्तव में टाइमआउट में 4 सेकंड लगते हैं, अगर टाइमआउट = 15 , वास्तव में टाइमआउट के लिए 30 सेकंड लेते हैं। क्यों? – TomSawyer