6

我正在寻找使用php检测文件夹更改的解决方案。该应用程序可以在两个平台(linuxwindows)上运行。只要结果相同,我可以为每个平台使用不同的方法。我想要的是:

  1. 如果将文件/文件夹添加到目录中,我希望我的应用程序检测到这个新文件并读取其属性(size,filetime等)
  2. 如果现有文件/文件夹已保存/内容更改/删除,我需要检测此文件已更改
  3. 如果我可以监视apache的webroot之外的基本文件夹会更好(例如c:\tmp,或d:\music在windows或/home/ertunclinux上)

我读了一些东西,inotify但我不确定它是否满足我的需求。

4

3 回答 3

3

监视文件系统的更改是一项应该在 PHP 之外解决的任务。它并不是真正为做这样的事情而设计的。

两个平台上都有现成的工具可以监控文件更改,这些更改可以调用 PHP 文件进行进一步处理。

对于 Linux:

对于 Windows:

于 2012-10-21T21:29:43.663 回答
2

因此,如果您正在检查与上次检查相比,而不是在更改后立即更新,您可以执行以下操作。

您可以创建目录的 MD5,存储此 MD5,然后将新的 MD5 与旧的 MD5 进行比较,以查看是否发生了变化。

以下取自http://php.net/manual/en/function.md5-file.php的函数将为您执行此操作。

function MD5_DIR($dir)
{
    if (!is_dir($dir))
    {
        return false;
    }

    $filemd5s = array();
    $d = dir($dir);

    while (false !== ($entry = $d->read()))
    {
        if ($entry != '.' && $entry != '..')
        {
             if (is_dir($dir.'/'.$entry))
             {
                 $filemd5s[] = MD5_DIR($dir.'/'.$entry);
             }
             else
             {
                 $filemd5s[] = md5_file($dir.'/'.$entry);
             }
         }
    }
    $d->close();
    return md5(implode('', $filemd5s));
}

但是,这相当低效,因为您可能知道,如果第一位不同,则检查目录的全部内容是没有意义的。

于 2012-10-21T21:30:26.480 回答
1

I would

  1. scan all folders/files and create an array of them,
  2. save this somewhere
  3. run this scan again later [to check if the array still looks the same].

As you have the entire data structure from "time 1" and "now", you can clearly see what has changed. To crawl through the directories, check this: http://www.evoluted.net/thinktank/web-development/php-directory-listing-script and this http://phpmaster.com/list-files-and-directories-with-php/

于 2012-10-21T21:31:37.540 回答