在Windows和Linux上使用PHP检测文件夹中的更改,是否有方法?

8
我正在寻找一种使用php检测文件夹变化的解决方案,该应用程序可以在两个平台(LinuxWindows)上运行。对于每个平台,我可能会使用不同的方法,只要结果相同即可。
我的需求如下:
  1. 如果文件/文件夹添加到目录中,我希望我的应用程序能够检测到这个新文件并读取它的属性(size,filetime等)。
  2. 如果现有文件/文件夹被保存/内容更改/删除,我需要检测到该文件已更改。
  3. 最好能够监视apache 之外的基础文件夹(例如在Windows上的c:\ tmpd:\ music、在Linux上的/ home/ertunc)。
我了解了inotify ,但不确定它是否满足我的需求。

这听起来像是一个应该在 PHP 之外解决的任务。 - Pekka
你希望多快地响应变化? - HappyTimeGopher
1
@HappyTimeGopher 其实这不是一个时间紧迫的应用程序。我需要变更列表,包括新增、删除和重写的内容。 - Ertunç
你可以在这里找到几个例子:http://php.net/manual/en/function.filemtime.php。 - Alain Tiemblo
3个回答

4

谢谢你的回答。它让我放弃了即时检测,因为它在Windows平台上引入了许多其他技术。不过我还是点了赞,因为它确实有帮助。 - Ertunç

2

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

你可以创建一个目录的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提到的方法来维护更改列表。对于我的第三个要求有任何问题吗? - Ertunç
1
监控 Webroot 外部很容易,因为 PHP 是服务器端的。第二个要求是,在整个目录上不执行 md5,而是对每个单独的文件进行分离的 md5 检查,然后只需保留一个类似结构的目录结构,但只包含 md5 总和。 - Jon Taylor

1

我的第三个要求有任何故障吗? - Ertunç
2
对于第三个要求,只需确保open_basedir关闭,并且PHP可以愉快地扫描所有系统文件夹。 - HappyTimeGopher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接