2013-02-20 14 views
5

मैं PHP के एक विशिष्ट खंड को सेकंड सेकेंड तक सीमित करना चाहता हूं - यदि यह अधिक समय लेता है, वर्तमान में निष्पादन कोड (केवल अनुभाग, पूरी स्क्रिप्ट नहीं) को मारें और एक वैकल्पिक कोड चलाओ।PHP - रोकें और पकड़ें कोड जो बहुत लंबा लगता है

छद्म कोड उदाहरण (उदाहरण यहां मामले का उपयोग एक अस्थिर एपीआई जो कभी कभी तेज है और दूसरी बार अपनी एक ब्लैक होल है):

$completed = 1; 
$seconds = 60; 
while ($completed != -1 && $completed < 5) { 
    limit ($seconds) { 
     $api = new SomeAPI('user','secret','key'); 
     $data = $api->getStuff('user="bob"'); 
     $completed = -1; 
    } catch() { 
     $completed++; 
     sleep(10); 
    } 
} 
if ($completed === 5) echo "Error: API black-hole'd 5 times.\n"; 
else { 
    //Notice: data processing is OUTSIDE of the time limit 
    foreach ($data as $row) { 
      echo $row['name'].': '.$row['message']."\n"; 
    } 
} 

हालांकि, इस कुछ भी के लिए काम करना चाहिए। सिर्फ एपीआई/HTTP अनुरोध नहीं। जैसे एक गहन डेटाबेस प्रक्रिया।

मामले में आप बहुत तेजी से पढ़ रहे हैं:set_time_limit और max_execution_timeनहीं जवाब कर रहे हैं के रूप में वे (समय के बजाय सिर्फ एक खंड पूरी स्क्रिप्ट के लिए सीमा को प्रभावित जब तक कि मैं कैसे उन पर गलत हूँ काम, ज़ाहिर है)।

+0

यदि एपीआई कर्ल पर निर्भर करता है, तो आप [टाइमआउट पैरामीटर] (http://stackoverflow.com/questions/2582057/setting-curls-timeout-in-php) पर एक नज़र डाल सकते हैं। – moonwave99

+0

मान लीजिए कि 'max_execution_time' पहले से ही ∞ –

+0

पर सेट हो चुका है, शायद कुछ कोशिश करने के लिए (अगर कर्ल का उपयोग नहीं किया जा रहा है) तो एसआईएन के अनुसार, एसिंक प्रोसेसिंग सिस्टम का उपयोग करेगा, एसओ के अनुसार उन्हें प्रोसेसिंग के दौरान मिडवे रोक दिया जा सकता है: http://stackoverflow.com/प्रश्न/2270323/रोक-gearman कार्यकर्ता-अच्छी तरह से – ChrisK

उत्तर

3

एपीआई कॉल के मामले में, मैं curl का उपयोग करने का सुझाव दूंगा, जिसके लिए आप एपीआई कॉल के लिए एक विशिष्ट टाइमआउट सेट कर सकते हैं।

सामान्य उपयोग के लिए, आप फोर्किंग प्रक्रियाओं को देख सकते हैं, जो आपको प्रत्येक प्रक्रिया को समय देने और इसे अपेक्षित समय से अधिक होने पर मारने की क्षमता प्रदान करेगा।

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

मैंने शायद आपके प्रश्न का सीधे जवाब नहीं दिया हो, लेकिन वास्तव में जिस बिंदु पर मैं जाना चाहता था वह यह है कि कोड ब्लॉक वास्तव में क्या करता है इसके आधार पर आपको एक अलग दृष्टिकोण का उपयोग करना पड़ सकता है।

संबंधित मुद्दे