while transversable objetos lista iterators iteradores php iterator iteration

objetos - transversable php



RecursiveDirectoryIterator lanza UnexpectedValueException en "Demasiados archivos abiertos" (1)

Simplemente al convertir el iterador en una matriz con la función iterator_to_array , parece que puede iterar tantos archivos como desee:

$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator("./folder/")); $files = iterator_to_array($iterator, true); // iterate over the directory // add each file found to the archive foreach ($files 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"; } }

El siguiente código:

$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();

Lanza la siguiente excepción si hay demasiados archivos en una subcarpeta sobre los que intenta iterar:

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

¿Cómo se puede iterar con éxito sobre una gran cantidad de carpetas y archivos sin experimentar esta excepción?