PHP-скрипт, который отправляет по электронной почте список файлов изменений, которые произошли в каталоге / подкаталогах - PullRequest
4 голосов
/ 04 мая 2011

У меня есть каталог с несколькими подкаталогами, в которые пользователи добавляют файлы через FTP. Я пытаюсь разработать php-скрипт (который я буду запускать как задание cron), который будет проверять каталог и его подкаталоги на наличие изменений в файлах, размерах файлов или датах изменений. Я искал долго и упорно и до сих пор можно найти только один сценарий, который работает, который я пытался изменить - оригинал, расположенный здесь - однако это только кажется, чтобы отправить первое уведомление по электронной почте, показывая мне, что перечислены в каталогах. Он также создает текстовый файл содержимого каталога и подкаталога, но когда сценарий запускается во второй раз, он, кажется, падает, и я получаю электронное письмо без содержимого.

Кто-нибудь знает простой способ сделать это в php? Сценарий, который я нашел, довольно сложный, и я часами пытался его отладить, но безуспешно.

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 04 мая 2011

Вот, пожалуйста:

$log = '/path/to/your/log.js';
$path = '/path/to/your/dir/with/files/';
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
$result = array();

foreach ($files as $file)
{
    if (is_file($file = strval($file)) === true)
    {
        $result[$file] = sprintf('%u|%u', filesize($file), filemtime($file));
    }
}

if (is_file($log) !== true)
{
    file_put_contents($log, json_encode($result), LOCK_EX);
}

// are there any differences?
if (count($diff = array_diff($result, json_decode(file_get_contents($log), true))) > 0)
{
    // send email with mail(), SwiftMailer, PHPMailer, ...
    $email = 'The following files have changed:' . "\n" . implode("\n", array_keys($diff));

    // update the log file with the new file info
    file_put_contents($log, json_encode($result), LOCK_EX);
}

Я предполагаю, что вы знаете, как отправить электронное письмо.Кроме того, имейте в виду, что файл $log должен храниться за пределами $path, который вы хотите отслеживать, по понятным причинам, конечно.

После прочтения вашего вопроса во второй раз, я заметилчто вы упомянули, что хотите проверить, изменились ли файлы , я делаю эту проверку только с размером и датой изменения, если вы действительно хотите проверить, отличается ли содержимое файла, я предлагаю вам использоватьхеш файла, так что это:

$result[$file] = sprintf('%u|%u', filesize($file), filemtime($file));

Становится так:

$result[$file] = sprintf('%u|%u|%s', filesize($file), filemtime($file), md5_file($file));
// or
$result[$file] = sprintf('%u|%u|%s', filesize($file), filemtime($file), sha1_file($file));

Но стоит помнить, что это будет намного дороже, так как хэш-функции должны открывать и читать всесодержимое ваших CSV-файлов объемом 1-5 МБ.

0 голосов
/ 04 мая 2011

Мне так нравится sfFinder, что я написал собственную адаптацию:

http://www.symfony -project.org / кулинарный / 1_0 / о / искатель

https://github.com/homer6/altumo/blob/master/source/php/Utils/Finder.php

Прост в использовании, хорошо работает.

Однако для вашего использования, в зависимости от размера файлов, я поместил бы все в репозиторий git. Это легко отследить.

НТН

...