Показать сообщение отдельно

  #15  
Старый 11.06.2009, 18:38
Pashkela
Динозавр
Регистрация: 10.01.2008
Сообщений: 2,841
Провел на форуме:
9220514

Репутация: 3338


По умолчанию

Вот скрипт, с помощью которого в секунду можно вычислить появление нового файла (у меня 146 344 файла, 64 мб оперативки, скрипт работал секунду или меньше).

Состоит из двух частей, сначала запускаем первую часть:

1. Создаёт образ (эталон) всех файлов на диске:
PHP код:
<?php
@set_time_limit(0); 
@
ini_set("display_errors","1");

$path '/home/www/lalala/http'// Абсолютный путь к корню, без слеша в конце

//Функция рекурсивного получения списка файлов и папок
function fold($rootDir$allData=array()) {
    
$invisibleFileNames = array(".""..");
    
$dirContent scandir($rootDir);
    foreach(
$dirContent as $key => $content) {
        
$path $rootDir.'/'.$content;
        if(!
in_array($content$invisibleFileNames)) {
            if(
is_file($path) && is_readable($path)) {
                
$allData[] = $path;//Файлы
            
}elseif(is_dir($path) && is_readable($path)) {
                
$allData fold($path$allData);
            }
        }
    }
    return 
$allData;
}
$a fold($path);
$count count($a);
$b implode("\r\n",$a);
$c fopen("etalon.txt","w");
fwrite ($c,$b);
fclose($c);
echo 
"Base of files updated, there are $count files in base";
?>
2. Чекает появление/удаление (относительно эталона) файлов:

PHP код:
<pre>
<?php
@set_time_limit(0); 
@
ini_set("display_errors","1");

$path '/home/www/lalala/http'// Абсолютный путь к корню, без слеша в конце

//Функция рекурсивного получения списка файлов и папок
function fold($rootDir$allData=array()) {
    
$invisibleFileNames = array(".""..");
    
$dirContent scandir($rootDir);
    foreach(
$dirContent as $key => $content) {
        
$path $rootDir.'/'.$content;
        if(!
in_array($content$invisibleFileNames)) {
            if(
is_file($path) && is_readable($path)) {
                
$allData[] = $path;//Файлы
            
}elseif(is_dir($path) && is_readable($path)) {
                
$allData fold($path$allData);
            }
        }
    }
    return 
$allData;
}
$a fold($path);
$count count($a);
$hfopen("etalon.txt","r");
while (!
feof($h)) $c[]=trim(fgets($h));
fclose($h);
$count1 count($c);
$diff $count $count1;
if (
$diff>=0$result array_diff($a$c);
else 
$result array_diff($c$a);
sort ($result);
$count2 count($result);
if (
$diff>=&& $count2!=0) {
  echo 
"Etalon base - $count1 files, Current base - $count files, difference is $diff files, new files below:\r\n\n\n";
  if (
$count2!=0) {
    for(
$i=0;$i<$count2;$i++) {
      echo 
"File - {$result[$i]}, FileDate - ".date("d.m.Y H:i"fileatime($result[$i])). " , FileSize - " round(filesize($result[$i])/1024,2) . "Kb\r\n";
    }
  }
}
if (
$diff<0) {
   echo 
"Etalon base - $count1 files, Current base - $count files, difference is $diff files, deleted files below:\r\n\n\n";
   if (
$count2!=0) {
     for(
$i=0;$i<$count2;$i++) {
       echo 
"File - {$result[$i]} was deleted\r\n";
     }
   }

if (
$count2==0)  echo "Etalon base - $count1 files, Current base - $count files, difference is $diff files, no changes\r\n\n\n";  
?>
</pre>
если etalon.txt хранить не на серве, то будет трудновато залить полноценный шелл, не меняя содержимого уже существующих файлов

Последний раз редактировалось Pashkela; 11.06.2009 в 18:41..
 
Ответить с цитированием