【问题标题】:Is there a way to detect changes in a folder using php on both windows and linux?有没有办法在 windows 和 linux 上使用 php 检测文件夹中的更改?
【发布时间】:2012-10-11 17:26:23
【问题描述】:

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

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

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

【问题讨论】:

  • 这听起来像是一个应该在 PHP 之外解决的任务。
  • 您希望以多快的速度响应更改?
  • @HappyTimeGopher 实际上它不是一个时间关键的应用程序。我需要更改列表。什么是添加删除什么是重写。
  • 你有几个例子here

标签: php shell notifications directory multiplatform


【解决方案1】:

我愿意

  1. 扫描所有文件夹/文件并创建一个数组,
  2. 将此保存在某处
  3. 稍后再次运行此扫描 [以检查阵列是否仍然相同]。

由于您拥有从“时间 1”到“现在”的整个数据结构,您可以清楚地看到发生了什么变化。要浏览目录,请检查:http://www.evoluted.net/thinktank/web-development/php-directory-listing-scripthttp://phpmaster.com/list-files-and-directories-with-php/

【讨论】:

  • 我的第三个要求有什么问题吗?
  • 对于第三个要求,只要确保 open_basedir 关闭并且 PHP 可以愉快地扫描所有系统文件夹。
【解决方案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));
}

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

【讨论】:

  • 这对于检测更改事件可能很有用。我想我还需要 Panique 提到的方法来维护更改列表。我的第三个要求有什么问题吗?
  • 使用 php 在 webroot 之外进行监控很容易,因为它是服务器端的。第二个要求,不是对整个目录执行 md5,而是对每个单独的文件进行单独的 md5 检查,然后保持一个目录结构在结构上相似但只包含 md5 总和。
【解决方案3】:

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

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

对于 Linux:

对于 Windows:

【讨论】:

  • 也感谢您的回答。它让我忽略了动态检测,因为它引入了许多其他技术,尤其是在 Windows 平台上。无论如何我都赞成,因为它有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-05
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
  • 1970-01-01
相关资源
最近更新 更多