Дек 09

php-med-trans-lightPHP язык не такой многословный и извилистый как Perl, но тоже любит поболтать. Сегодня поговорим о работе с директориями. В PHP существует для этого 3 стандартных способа.

  1. scandir
  2. <?php
    $dir_array = scandir('dirs');
    foreach($dir_array as $dir){
            if($dir !== '.' && $dir !== '..'){
                    echo "$dir\n";
            }
    }
    ?>
  3. opendir+ readdir
  4. <?php
    $dir_handle = opendir('dirs');
    while(false != ($dir = readdir($dir_handle))){
            if($dir !== '.' && $dir !== '..'){
              echo "$dir\n";
            }
    }
    ?>
  5. dir
  6. <?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)

Оставить комментарий

preload preload preload