ए) फ़ोरैच से समय गणना को खींचें। आपके पास प्रारंभ समय है और आप 5 सेकंड का रनटाइम चाहते हैं, इसलिए आप एंडटाइम की गणना पहले से शुरू कर सकते हैं (स्टार्टिम + 5 एस)। foreach के अंदर, बस तुलना करें कि समय अधिक है या अंतराल के बराबर है, तो तोड़ें।
बी) प्रश्न: क्या एक निश्चित बिंदु से लूप शुरू करना संभव है? अगले अनुरोध में मैं अपने ब्रेक पॉइंट से फिर से कैसे शुरू करूं?
दो दृष्टिकोण मेरे दिमाग में आते हैं।
आप पिछले प्रसंस्करण बिंदु और इटरेटर स्टोर और अंतिम बिंदु पर फिर से शुरू + 1. आप अगले अनुरोध पर यह करने के लिए यात्रा के अंतिम स्थिति बचाने के लिए और तेजी से आगे हैं, iterator- फोन करके> अगले सकता है() जब तक आप प्रक्रिया के लिए अगले आइटम तक नहीं पहुंच जाते, जो $ अंतिम स्थिति + 1 है। हमें इटरेटर और अंतिम स्थिति को स्टोर करना होगा और अगले अनुरोध पर दोनों को चुनना होगा, जब तक अंतिम स्थिति इटेटरेटर में तत्वों की कुल संख्या के बराबर होती है।
या, आप पहले रन पर इटरेटर को सरणी में बदल सकते हैं: $array = iterator_to_array($iterator);
और उसके बाद एक कम सरणी दृष्टिकोण का उपयोग करें। (हो सकता है कि किसी और जानता है कि कैसे एक इटरेटर वस्तु को कम।) इस दृष्टिकोण आप केवल डाटा स्टोर हैं, जो जब तक 0.
कोड अपरीक्षित है अनुरोध के द्वारा अनुरोध कम हो जाती है के साथ। यह सिर्फ एक त्वरित मसौदा है।
$starttime = time();
$endtime = $starttime + (5 * 60); // 5sec
$totalElements = count($array);
for($i = 0; $i <= $totalElements; $i++)
{
if(time() >= $endtime) {
break;
}
doStuffWith($array[$i]);
}
echo 'Processed ' . $i . ' elements in 5 seconds';
// exit condition is "totalElements to process = 0"
// greater 1 means there is more work to do
if(($totalElements - $i) >= 1) {
// chop off all the processed items from the inital array
// and build the array for the next processing request
$reduced_array = array_slice(array, $i);
// save the reduced array to cache, session, disk
store($reduced_array);
} else {
echo 'Done.';
}
// on the next request, load the array and resume the steps above...
कुल मिलाकर, इस बैच प्रोसेसिंग और, एक कार्यकर्ता/नौकरी कतार से और अधिक कुशलता से किया जा सकता है जैसे:
स्रोत
2014-12-18 15:32:00
1. संसाधित वस्तुओं की संख्या को पुनर्स्थापित करें; यदि यह सेट नहीं है तो इसे शून्य से प्रारंभ करें; 2. लूप दर्ज करें, संसाधित वस्तुओं की संख्या छोड़ें; 3. एक आइटम को संसाधित करें; 4. इसे गिनें; 5. लूप तोड़ो; 6. अगले अनुरोध पर मान पास करें (सत्र या क्वेरी स्ट्रिंग का उपयोग करके)। धोये और दोहराएं। – axiac