PHP язык не такой многословный и извилистый как Perl, но тоже любит поболтать. Сегодня поговорим о работе с директориями. В PHP существует для этого 3 стандартных способа.
- scandir
- opendir+ readdir
- dir
<?php $dir_array = scandir('dirs'); foreach($dir_array as $dir){ if($dir !== '.' && $dir !== '..'){ echo "$dir\n"; } } ?>
<?php $dir_handle = opendir('dirs'); while(false != ($dir = readdir($dir_handle))){ if($dir !== '.' && $dir !== '..'){ echo "$dir\n"; } } ?>
<?php $dir_class = dir('dirs'); while(false !== ($dir = $dir_class->read())){ if($dir !== '.' && $dir !== '..'){ echo "$dir\n"; } } ?>
А теперь самое интересное: проведём небольшой синтетический тест на производительность этих функций. Предварительно уберём проверки и вывод.
Для тестирование создаём директорию, которая содержит 1 млн. файлов
быстрее всего это можно сделать так
for i in $(seq 0 1000000);do echo > $i; done
у меня это закончилось с такими показателями
real 1m40.012s user 0m32.628s sys 0m44.776s
на Gentoo 2.6.31 , ext4 , Pentium Dual Core 2160 (1.8GHz), 1GB ОЗУ
теперь приступим к запуску тестов PHP (учитываю время повторного выполнения, после перемещения файлов в кэш)
1. scandir
<?php scandir('dirs'); ?>
real 0m3.370s user 0m2.511s sys 0m0.730s
так как scandir помимо чтения ещё и сортирует, только не очень удачно , например с числами это выглядит так:
215197 215198 215199 2152 21520 215200 215201
то не будем давать фору другим способам чтения директорий.
2. opendir + readdir
без сортировки, т.е. если Вам достаточно прочитать содержимое директории
<?php $dir_handle = opendir('dirs'); while(false !== (readdir($dir_handle))); ?>
результат будет таким
real 0m1.438s user 0m0.779s sys 0m0.616s
и с сортировкой:
<?php $dir_handle = opendir('dirs'); while(false !== ($dir = readdir($dir_handle))){ $dir_array[] = $dir; } sort($dir_array); ?>
результат такой
real 0m10.554s user 0m9.489s sys 0m0.739s
3. dir
Без сортировки
<?php $dir_class = dir('dirs'); while(false !== ($dir_class->read())); ?>
получаем
real 0m1.686s user 0m1.015s sys 0m0.663s
И с сортровкой
<?php $dir_class = dir('dirs'); while(false !== ($dir = $dir_class->read())){ $dir_array[] = $dir; } sort($dir_array); ?>
результат таков
real 0m11.436s user 0m10.492s sys 0m0.697s
P.S.
Возможно инициализация массива вместе с sort не лучший способ для сортировки, но это было не главным в этой заметке
Похожие записи:
Поиск файлов и директорий в каталоге (PHP)