очень распространенный вопрос и до сих пор не нашел правильного решения для этого. Мне нужно запустить задание cron, чтобы запустить php-скрипт каждое утро, чтобы перечислить все новые файлы, созданные на веб-сервере в течение ночи. Это очень полезно, чтобы посмотреть, какие посетители загрузили в ночное время, и, конечно же, эти файлы могут быть вредоносными файлами, что повредит другим компьютерам-посетителям. Пока у меня это:
$dir = "../root/"; $pattern = '\.*$'; // check only file with these ext. $newstamp = 0; $newname = ""; if ($handle = opendir($dir)) { while (false !== ($fname = readdir($handle))) { // Eliminate current directory, parent directory if (ereg('^\.{1,2}$',$fname)) continue; // Eliminate other pages not in pattern if (! ereg($pattern,$fname)) continue; $timedat = filemtime("$dir/$fname"); if ($timedat > $newstamp) { $newstamp = $timedat; $newname = $fname; } } } closedir ($handle); // $newstamp is the time for the latest file // $newname is the name of the latest file // print last mod.file - format date as you like print $newname . " - " . date( "Y/m/d", $newstamp);
это печатает новейший файл, но только в одном каталоге root / и не проверяет, например, root / folder / и т. д. Как это сделать recusrsivly? Если я добавлю новый файл в корневую / папку, скрипт покажет мне папку с датой, но не покажет, какой файл в корне / папке был создан. Надеюсь, вы понимаете, что я имею в виду, спасибо
Быстрый скрипт, который делает то, что вы хотите (протестирован под Windows 7 с помощью cygwin и под ubuntu 12.10 с PHP 5.3.10 )
<?php $path = $argv[1]; $since = strtotime('-10 second'); // use this for previous day: '-1 day' $ite = new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS); foreach ( new RecursiveIteratorIterator($ite) as $filename => $object ) { if (filemtime($filename) > $since) { echo "$filename recently created\n"; } }
Мой быстрый тест:
$> mkdir -p d1/d2 $> touch d1/d2/foo $> php test.php . ./d1/d2/foo recently created $> php test.php . # 10secs later $>