Файловые операции PHP5 - тормоза

Sirius

PHP+MySQL=LOVE
Файловые операции PHP5 - тормоза

Я тут создал темку про функцию подсчёта файлов и общего размера, которую Фанат скинул в корзинку.

Короче я разобрался.

В 5 версии простые нижеприведённые файловые операции выполняются дольше чем в 4-й версии в кол-во раз:
opendir() - 3
isfile() - 2

Когда их вызываешь в цикле (считая большое количество файлов и папок:)
opendir() - 5
isfile() - 5-8 раз

Единственный способ ускорить функцию определения количества и размера файлов не проверять на isfile() (просто исходя, что если !isdir() - то это файл)

На всякий случай написал - уже разуверился, что это кому-нибудь может быть интересным :)

Удачи
 

ys

отодвинутый новичок
> (просто исходя, что если !isdir() - то это файл)

А symlink?
А /dev/urandom ?
 

Sirius

PHP+MySQL=LOVE
Да - согласен!


isdir в цикле тоже ужасно работает оказывается. Когда он стоял за isfile - скорость была хорошей (видно php кеширует инфу, когда работает isfile первым - после него все операции isdir, islink будут работать быстрее ) - а когда первым ставишь isdir то уже сам isdir жрёт времени в 5 раз больше.

Кто нить может объяснить - почему?

как оптимизировать?

-~{}~ 12.12.05 16:37:

Называется бред сумасшедшего - сам с собой :)

Короче я нашёл проблему непонятную в PHP5 - во всех файловых операциях указывая абсолютный путь к файлу мы сильно увеличиваем время операции.

Относительный путь к файлу в операторах is_file, is_dir, opendir, readdir работает на порядок быстрее (особенно быстро почему то в цикле вызовов)
 

Фанат

oncle terrible
Команда форума
в циклебыстро потому, что результаты кэшируются.
а полный путь если и работает медленно, то только в юникс системах.
и пхп тут вообще не при чём.
 

Sirius

PHP+MySQL=LOVE
Фанат - извини обломаю :)

В цикле как раз-таки медленнее в случае с абсолютными путями. (прошлый пост в скобках я неверно изъяснился)

А с относительными путями в цикле скорость почти та же, как и в одиночных запросах.

Я могу дать код для проверки, если кому-нибудь интересно - там с Таймерами.

Я тестил на Windows XP - это на винде так тормозит.
И на Юниксе также тормозит - потому что всё началось с моего клиента у которого PHP5.0.4, Linux, Apache 2.0.55.
 

si

Administrator
а полный путь если и работает медленно, то только в юникс системах.
почему это ? я думаю как раз на оборот, не надо делать лишних syscall на получение полного пути

-~{}~ 12.12.05 15:39:

Sirius
то что РНР кеширует данные о файле это даже в мане написано.
 

tony2001

TeaM PHPClub
JFYI

is_dir() в цикле по директории:
4.4.2 - 0.004 сек.
5.1.2 - 0.0033 сек.

в директории 613 файлов.
 

Sirius

PHP+MySQL=LOVE
tony2001 спасибо за участие!

Полный путь указывал к файлам аль нет?

Пожалуйста код в студию - посмотрю
 

tony2001

TeaM PHPClub
PHP:
function microtime_float()
{
       $time = explode(" ", microtime());
       return ((float)$time[0] + (float)$time[1]);
}

$start = microtime_float();
$dir = opendir("/home/some/dir");
while($file = readdir($dir)) {
    is_dir("/home/some/dir/".$file);
}
closedir($dir);
var_dump(microtime_float()-$start);
 

Sirius

PHP+MySQL=LOVE
tony2001 - спасибо - твой код работает с 3-4 разу - сначала большие значения. Мне кажется что с кешем дело. А вот если переходить во внутренние директории?

Попробуй пожалуйста этот код:

PHP:
function microtime_float() 
{ 
       $time = explode(" ", microtime()); 
       return ((float)$time[0] + (float)$time[1]); 
} 

$start = microtime_float(); 
function CheckDirs($MyDir) 
{
$dir = opendir($MyDir); 
while(false!==($file = readdir($dir))) { 
		if(($file == ".") || ($file == "..")) continue;
    if(!is_file($MyDir.'/'.$file))
			CheckDirs($MyDir.'/'.$file);
} 
closedir($dir); 
}

// Only Absolute path please:
CheckDirs('/home/some/dir');
var_dump(microtime_float()-$start);
4.3.8 - 0.083 сек.
5.1.1 - 0.579 сек.

В чём именно разница??? Я не могу понять!

-~{}~ 12.12.05 19:29:

Да - ну конечно директория должна содержать вложенные директории и файлы.

Спасибо
 

Sirius

PHP+MySQL=LOVE
tony2001 - ну у тебя этот код работает хоть?

Чего выяснять то? Я уже устал :(
 

Sirius

PHP+MySQL=LOVE
Работает быстро????

Я НЕ ПОНИМАЮ :( Ну почему в PHP4 быстро? Почему если ставлю в relative path - быстро даже в PHP5! Я даже php.ini полностью скопировал.

Вот результаты:
4.3.8 - 0.083 сек.
5.1.1 - 0.579 сек. (absolute path)
5.1.1 - 0.104 сек (relative path)

Млллинн - ну не верю, что у тя работает быстро как 4-рке :((((

Пошёл топиться... :(

-~{}~ 12.12.05 19:49:

si - под вебсервером!
 

Sirius

PHP+MySQL=LOVE
si - вот:
Кста!!! - Для relative paths тоже самое время!!! никакого прогресса в этом случае!

Код:
C:\home\PHP5>php.exe c:\home\www\index.php
float(0.546802043915)
12


C:\home\PHP5>php-cgi.exe c:\home\www\index.php
X-Powered-By: PHP/5.1.1
Content-type: text/html

float(0.547046899796)
12

C:\home\PHP>php.exe c:\home\www\index.php
Content-type: text/html
X-Powered-By: PHP/4.3.8

float(0.0644271373749)
12
(12 - количество вызовов рекурсий - думаю может в них дело)
 

Sirius

PHP+MySQL=LOVE
Фанат - не смешно :(

одна конечно - но ведь тоже самое и на домашнем компе - вот сейчас приду домой ещё раз проверю на нём...

Спасибо всем - до завтра!
 

si

Administrator
[si@dbs] #>./php5 -f 2.php
float(7.2080640792847)
[si@dbs] #>./php5 -f 2.php
float(7.4101009368896)
[si@dbs] #>find ./ 2>/dev/null | wc -l
239583
 
Сверху