{ $Start=time();
// Состояние в самом начале работы. Нужно обработать
// корневой каталог $Root.
$Prg=array(
"Todo" => array($Root), // для накопления путей необработанных файлов
"Res" => array() // результат обработки всех файлов
);
// Пытаемся загрузить текущее состояние. Если не получается,
// значит, обход только что начался.
if($f=@fopen($cache,"rb")) {
if(@flock($f,LOCK_SH)) {
$Prg=Unserialize(fread($f,filesize($cache)));
fclose($f);
}
}
// Обходим сайт — по одной итерации цикла на каждый файл или
// каталог. Найденные файлы добавляются в конец массива
// $Prg['Res'], а подвергающиеся обработке — извлекаются из его
// начала. Таким образом, мы продолжаем процесс до тех пор,
// пока не будут "пройдены" все файлы на сервере.
do {
// очередное полное имя файла
$fname=array_shift($Prg['Todo']);
// если это не файл и не каталог, пропускаем
if(!@is_file($fname) && !@is_dir($fname)) continue;
// если это каталог, добавляем все его содержимое
if(@is_dir($fname)) {
$Files=array();
for($d=openDir($fname); $e=readDir($d); ) {
if($e=="."||$e=="..") continue;
$Files[]="$fname/$e";
}
closeDir($d);
// вставляем в начало массива, чтобы на следующей итерации
// цикла обрабатывались именно эти файлы
$Prg['Todo']=array_merge($Files,$Prg['Todo']);
}
// вызываем функцию для обработки очередного файла или каталога
$Func($fname,$Prg['Res']);
// выходим, если время истекло, или же необработанных
// файлов не осталось.
} while(time()-$Start<$time && count($Prg['Todo']));
// Вернуть текущий результат в $Result.
$Result=$Prg['Res'];
// Если еще есть файлы для обработки, сохранить состояние.
if(count($Prg['Todo'])) {
// Сохраняем текущее состояние. В следующий раз мы начнем с него.