2014-12-18 7 views
7

के साथ रिकर्सिव डायरेक्टरी इटेटरेटर क्या एक निश्चित बिंदु से लूप शुरू करना संभव है?ऑफसेट

$iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path, $flags)); 

$startTime = microtime(true); 
foreach($iterator as $pathName => $file){ 

    // file processing here 

    // after 5 seconds stop and continue in the next request 
    $elapsedSecs = (microtime(true) - $startTime); 
    if($elapsedSecs > 5) 
    break; 
} 

लेकिन अगले अनुरोध में मैं अपने ब्रेक पॉइंट से फिर से कैसे शुरू करूं?

+0

1. संसाधित वस्तुओं की संख्या को पुनर्स्थापित करें; यदि यह सेट नहीं है तो इसे शून्य से प्रारंभ करें; 2. लूप दर्ज करें, संसाधित वस्तुओं की संख्या छोड़ें; 3. एक आइटम को संसाधित करें; 4. इसे गिनें; 5. लूप तोड़ो; 6. अगले अनुरोध पर मान पास करें (सत्र या क्वेरी स्ट्रिंग का उपयोग करके)। धोये और दोहराएं। – axiac

उत्तर

2

ए) फ़ोरैच से समय गणना को खींचें। आपके पास प्रारंभ समय है और आप 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... 

कुल मिलाकर, इस बैच प्रोसेसिंग और, एक कार्यकर्ता/नौकरी कतार से और अधिक कुशलता से किया जा सकता है जैसे:

+1

धन्यवाद, मैं गियरमैन की कोशिश करूंगा। मैंने कहीं पूर्ण सरणी को संग्रहीत करने के बारे में सोचा लेकिन कुछ मामलों में यह 200 के तत्वों तक पहुंच सकता है, और मुझे पूरा यकीन है कि PHP में बहुत सारे संसाधन लेते हैं –

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