Я должен сделать функцию, которая перечисляет все подпапки в папку. У меня есть фильтр без файлов, но функция использует scandir () для листинга. Это делает приложение очень медленным. Есть ли альтернатива scandir (), даже не встроенная функция php? Заранее спасибо!
Вы можете использовать readdir, который может быть быстрее, примерно так:
function readDirectory($Directory,$Recursive = true) { if(is_dir($Directory) === false) { return false; } try { $Resource = opendir($Directory); $Found = array(); while(false !== ($Item = readdir($Resource))) { if($Item == "." || $Item == "..") { continue; } if($Recursive === true && is_dir($Item)) { $Found[] = readDirectory($Directory . $Item); }else { $Found[] = $Directory . $Item; } } }catch(Exception $e) { return false; } return $Found; }
Может потребоваться некоторое tweeking, но это, по сути, то, что делает скандир, и это должно быть быстрее, если не нужно писать обновление, так как я хотел бы узнать, могу ли я сделать более быстрое решение.
Другая проблема заключается в том, что если вы читаете очень большой каталог, который заполняет массив во внутренней памяти, и это может происходить в вашей памяти.
Вы можете попытаться создать функцию, которая читает в смещениях, чтобы вы могли возвращать 50 файлов за раз!
чтение фрагментов файлов одновременно было бы простым в использовании, было бы так:
$offset = 0; while(false !== ($Batch = ReadFilesByOffset("/tmp",$offset))) { //Use $batch here which contains 50 or less files! //Increment the offset: $offset += 50; }
Не пишите свои собственные. PHP имеет рекурсивный каталог Iterator, созданный специально для этого:
http://php.net/manual/en/class.recursivedirectoryiterator.php
Как правило, (ака не 100% времени), поскольку он реализован в прямом C, все, что вы создаете в PHP, будет медленнее.