Ходьба по диску всегда будет медленнее идеальной, просто из-за всех поисков, которые нужно сделать. Если это не проблема для вас, я бы посоветовал поработать над устранением накладных расходов ... начиная с минимизации количества вызовов fork (). Тогда вы можете просто кешировать результат так долго, как считаете нужным.
Поскольку вы уже упомянули PHP, я предлагаю написать всю вашу серверную систему на PHP и использовать классы DirectoryIterator или RecursiveDirectoryIterator . Вот SO ответ для чего-то похожего на то, что вы просили реализовать с помощью первого.
Если возникают проблемы с дисковым вводом-выводом, я советую реализовать систему по принципу mlocate , которая кэширует список каталогов вместе с каталогом ctimes и использует stat () для сравнения ctimes и только перечитайте каталоги, содержимое которых изменилось.
Я не слишком много работаю с файловой системой в PHP, но, если бы это помогло, я могу предложить вам реализацию Python базового процесса updatedb в стиле mlocate. (Я использую его для индексации файлов, которые должны быть восстановлены с DVD + R вручную, если мой привод когда-либо выходит из строя, потому что они слишком велики, чтобы удобно помещаться на моем целевом диске rdiff-backup) *