2011-08-22 14 views
7

निम्नलिखित कोड:RecursiveDirectoryIterator "बहुत अधिक फ़ाइलें खुली" पर UnexpectedValueException फेंकता

$zip = new ZipArchive(); 

if ($zip->open('./archive.zip', ZIPARCHIVE::CREATE) !== TRUE) { 
    die ("Could not open archive"); 
} 

$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator("./folder/")); 

foreach ($iterator as $key => $value) { 
    try { 
    $zip->addFile(realpath($key), $key); 
    echo "'$key' successfully added.\n"; 
    } catch (Exception $e) { 
    echo "ERROR: Could not add the file '$key': $e\n"; 
    } 
} 

$zip->close(); 

निम्न अपवाद फेंकता अगर वहाँ एक उप-फ़ोल्डर जो तुम पर पुनरावृति की कोशिश कर रहे में बहुत सारी फ़ाइलें हैं:

Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(./some/path/): failed to open dir: Too many open files' in /some/other/path/zip.php:24 
Stack trace: 
#0 [internal function]: RecursiveDirectoryIterator->__construct('./some/path/') 
#1 /some/other/path/zip.php(24): RecursiveDirectoryIterator->getChildren() 
#2 {main} 
thrown in /some/other/path/zip.php on line 24 

इस अपवाद का अनुभव किए बिना आप बड़ी मात्रा में फ़ोल्डरों और फ़ाइलों को सफलतापूर्वक कैसे सक्रिय कर सकते हैं?

उत्तर

7

सीधे शब्दों में iterator_to_array समारोह के साथ एक सरणी के लिए इटरेटर परिवर्तित करके, ऐसा लगता है जैसे आप के रूप में कई फ़ाइलों पर पुनरावृति के रूप में आप चाहें तो कर सकते हैं: