Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
$parent_dir = 2;
while (($file = readdir($dh)) !== false) {
if($parent_dir && ($file === '.' || $file === '..')) {$parent_dir--;continue;}
// ...
}
<?php
$parent = 2;
while (false !== ($f = readdir($dh))) {
if ($f == '.' || $f == '..') {
$parent--;
if ($parent == 0) break;
continue;
}
$files .= "$f/";
}
if (false !== $f) {
while (false !== ($f = readdir($dh))) $files .= "$f/";
}
Такой код, на самом деле, позволяет открыть папку в 500к файлов, потребляя меньше 32 Мб, причём это с учётом json_encode. Поскольку мы составляем очень простую структуру данных — просто строку, время работы json_encode тоже будет очень небольшим, как и затраты на парсинг со стороны браузера.
Основная мысль в накоплении результата в том, чтобы потом это сжать в gzip и отдать клиенту раз в 5 меньше трафика
Потрбление памяти приведено для случая, когда средняя длина файла составляет примерно 10 символов
Излишне оптимистично.
gzip умеет работать с потоковыми данными. Да, это не так эффективно, зато экономится память (если у вас стояла цель ее сэкономить).
Чисто теоретически — я согласен, можно было бы сделать и так, но пришлось бы поизвращаться
То есть, отдать-то, в принципе, можно и больше, только мы начнем упираться в то, что память начнет кончаться на клиенте.
Вот поэтому и используют пейджинг.
Возможно, в PHP пришлось бы, не знаком с окружением. В asp.net это делается вообще прозрачно для программиста.
Но для списка файлов эффективно реализовать постраничную навигацию нелегко, вы ведь не можете начать чтение директории с середины.
Согласитесь, навигация без страниц, а с обычной прокруткой списка намного приятнее.
Интересность приведенного мной решения заключается в том, что оно очень простое, очень быстрое, потребляет очень мало памяти и решает поставленную мной задачу — сделать возможность открывать папки до 1 млн файлов в моём файловом менеджере.
История одного файлового менеджера