发送电子邮件的PHP脚本,列出目录/子目录中发生的文件更改

时间:2011-05-03 22:24:46

标签: php ftp cron

我有一个目录,其中包含许多用户通过FTP添加文件的子目录。我正在尝试开发一个PHP脚本(我将作为一个cron作业运行),它将检查目录及其子目录中的文件,文件大小或修改日期的任何更改。我搜索得很长很难,到目前为止只发现了一个有效的脚本,我试图修改它 - 原始位于here - 但它似乎只发送第一封电子邮件通知显示我列出的内容目录。它还会创建目录和子目录内容的文本文件,但是当脚本第二次运行时,它似乎会崩溃,并且我收到一封没有内容的电子邮件。

那里的任何人都知道在php中执行此操作的简单方法吗?我发现的脚本非常复杂,我已经尝试了几个小时来调试它但没有成功。

提前致谢!

2 个答案:

答案 0 :(得分:1)

你走了:

$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));

但请记住,这会更加昂贵,因为哈希函数必须打开并读取1-5 MB CSV文件的所有内容。

答案 1 :(得分:0)

我非常喜欢sfFinder,所以我写了自己的改编:

http://www.symfony-project.org/cookbook/1_0/en/finder

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

使用简单,效果很好。

但是,为了您的使用,根据文件的大小,我将所有内容都放在git存储库中。这很容易跟踪。

HTH