In Linux we trust!

Листинг каталога с миллионом файлов

Для начала зададим алиас для сброса дисковых буферов. Он там необходим для точных замеров времени.

$ dropbuf() { sudo sync && echo 3 | sudo tee /proc/sys/vm/drop_caches &>/dev/null; }

Создадим каталог с миллионом файлов:

$ mkdir -p /tmp/test1m && cd $_
$ for i in {1..1000000}; do echo "$i" >"$i"; done

Сравним 2 листинга (перед каждым замером сбрасываю буфера).

$ dropbuf
$ time ls -l >/dev/null
real  1m31.357s
user  0m6.836s
sys   0m6.052s
$ dropbuf
$ time ls -1U >/dev/null
real  0m29.315s
user  0m0.188s
sys   0m0.460s

Первая команда выполняет листинг всего каталога с сортировкой и по каждому файлу делает fstat для вывода информации оного. Вторая команда игнорирует сортировку (-U) и не выводит никакой доп. информации по файлам (-1).

Обратите внимание на тайминги, вторая команда большую часть времени ждала диск, а первая - 6 дополнительных секунд потратила на сортировку.

Эффективно и быстро прочитать каталог в PHP, можно следующим образом:

$dir = dir(".") or exit();
while (($entry = $dir->read()) !== false) {
    echo $entry, "\n";
}
$dir->close();