Возможно, вы захотите серьезно подумать только об использовании GNU find. Если он доступен, а безопасный режим не включен, вам, вероятно, понравятся результаты:
function list_recursive($dir) {
$dir=escapeshellcmd($dir);
$h = popen("/usr/bin/find $dir -type f", "r")
while ($s = fgets($h,1024)) {
echo $s;
}
pclose($h);
}
Однако, возможно, существует какой-то каталог, который настолько велик, что вам не захочется и беспокоиться об этом. Рассмотрим амортизацию медлительности другими способами. Ваша вторая попытка может быть проверена (например) путем простого сохранения стека каталогов в сеансе. Если вы предоставляете пользователю список файлов, просто соберите страничку и сохраните оставшуюся часть состояния в сеансе для страницы 2.