2011-08-22 22 views
7

Poniższy kod:RecursiveDirectoryIterator rzuca UnexpectedValueException na „Zbyt wiele otwartych plików”

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

rzuca następujący wyjątek, jeśli istnieje zbyt wiele plików w podkatalogu którą próbujesz iteracyjne nad:

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 

W jaki sposób można pomyślnie przeprowadzić iterację w dużej liczbie folderów i plików bez doświadczania tego wyjątku?

Odpowiedz

7

prostu przekształcając iterator do tablicy z funkcją iterator_to_array, wydaje się, że można iteracyjne nad dowolną liczbę plików, jak chcesz:

Powiązane problemy