САМОУЧИТЕЛЬ PHP 4



         

Разделенные вычисления - часть 3


{ $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'])) {

    // Сохраняем текущее состояние. В следующий раз мы начнем с него.




Содержание  Назад  Вперед