
11.06.2009, 18:38
|
|
Динозавр
Регистрация: 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);
$h= fopen("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>=0 && $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..
|
|
|