【问题标题】:PHP script that sends an email listing file changes that have happened in a directory/subdirectories发送电子邮件的 PHP 脚本,列出目录/子目录中发生的文件更改
【发布时间】:2011-05-03 22:24:46
【问题描述】:

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

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

提前致谢!

【问题讨论】:

  • 您正在跟踪的文件有多大?

标签: php ftp cron


【解决方案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 文件的所有内容。

【讨论】:

  • 嗨,Alix,谢谢,我的意思是如果文件名更改而不是文件内容更改,那么第一组代码应该没问题。我试试看!我刚才在玩弄一个脚本,将修改后的文件名、大小和日期放入 mysql 表中,然后在每次运行脚本时根据目录内容查询表 - 但你的方法似乎更干净!
  • @estebannn:你也可以让它与 MySQL 一起工作,但老实说,我认为在你的特定场景中不需要这样做,是的,它可以与 sub(-sub-... ) 目录,因为我使用了RecursiveDirectoryIterator 类。
  • @estebannn:很抱歉,我的代码有两个错误,我一直在喝酒,我想我的分析能力还没有达到使我的代码没有错误的水平。但是,它们现在已修复。 =)
【解决方案2】:

我非常喜欢 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

【讨论】:

  • 感谢您的回复!但是,我认为我需要的可能比这更简单。有问题的文件是 1-5Mb 的 csv 文件。我基本上只需要在任何给定时间检查自上次检查以来用户是否修改了目录中的文件,然后让脚本向我发送一封电子邮件,列出已更改的文件。再次感谢您如此快速的回复,不胜感激!
  • @Alix:当您自己发布答案时,不要记下其他答案。这不是优雅的。 sfFinder 会有所帮助,但正如您所见,我还建议使用 git 来查找文件增量。
  • @Homer6:是什么让你如此确定我投了你的票?!诬告也不优雅……至于你的回答,你推荐的选项都没有真正回答 OP 问题,因此不要指望得到它的表扬。
  • @Alix:我没说你投票给我。我说你拒绝了我的回答,就像被批评的那样。你做了什么;因此,这不是诬告。这就是真实发生的事情。 :-) 尽管如此,你确实提供了一个答案,所以在这方面对你表示敬意。
  • @Homer6:哦!好吧,我不是想无礼,只是指出一个事实。如果 OP 无法理解 sfFinder 代码,他可能会在意识到它的作用之前苦苦挣扎几个小时。对不起,如果我来得太严厉了。 =)
猜你喜欢
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多