【问题标题】:How to efficiently monitor a directory for changes on linux?如何有效地监控 linux 上的目录更改?
【发布时间】:2011-10-10 22:32:47
【问题描述】:

我正在使用 Magento,并且有一个功能可以将 CSS 和 Javascript 合并到一个大文件中。

不管这样的优劣,都有以下问题:

最终文件被缓存在多个级别,包括但不限于:

  • Amazon CloudFront
  • 代理服务器
  • 客户端浏览器缓存

Magento 使用连接的 css 文件名的 MD5 和来为合并的 css 文件生成新的文件名。这样每个具有不同 css 文件集的页面都会得到一个适当的合并 css 文件。

为了解决缓存问题,我还将文件修改时间戳包含在该哈希中,以便在每次修改 css 文件时生成一个新的哈希。

因此,非重新验证缓存分数的全部优势,但如果发生更改,它会立即可见,因为资源链接已更改。

到目前为止一切顺利:

唯一的问题是,用于生成 has 的文件名只是通常在 HTML-Head 块中直接引用的文件名,不要 在这些文件中包含 css 导入

因此,在 css 文件中导入的文件的更改不会产生新的哈希。

不,我真的不想递归解析所有导入并扫描它们或类似的东西。

我宁愿考虑基于目录的解决方案。有什么东西可以有效地监控基于文件系统的“目录内的最后更改”吗?

我们正在使用 ext4。

或者也许有另一种方法,也许是使用 find 命令,基于 inode 索引完成所有工作?

类似的东西?

我见过很多无需扫描整个文件系统即可立即“看到”更改的程序。我相信在 linux 下也有某种“文件操作监视”守护进程可用。

问题是css目录非常大。

谁能指出我正确的方向?

【问题讨论】:

    标签: php linux filesystems directory inode


    【解决方案1】:

    我建议您在修改依赖 php 文件之一时使用独立于 php 的守护程序来修改主 css 文件的更改日期。您可以为此使用 dnotify,例如:

    dnotify -a -r -b -s /path/to/imported/css/files/ -e touch /path/to/main/css/file;
    

    每次修改其他文件夹中的一个文件时,它将在主 css 文件上执行“触摸”(-a -r -b -s = 任何访问/递归目录查找/在后台运行/无输出)。或者您可以执行任何其他操作并通过 PHP 对其进行测试。

    【讨论】:

    • 迄今为止最好的解决方案!我很喜欢。我希望有一个更独立的解决方案,不需要开始收听后台作业,但我真的很喜欢。
    • 嗯,PHP 通常比编译程序慢得多,并且对每个页面加载进行检查比每次更改触发一次动作要昂贵得多(因为更改很少见)。但是,如果您不关心速度 - 您可以使用 php 的 readdir() 函数循环浏览您的文件夹,并在每个文件上使用 php 的 stat() 函数来获取 mtime(最后修改时间)。如果在应用更改之前允许一些延迟,您可以大大提高性能 - 您可以仅每 N 分钟运行一次此检查(您可以使用数据库/临时文件/等来保存上次检查时间)或使用 cron。跨度>
    【解决方案2】:

    如果你使用命令

    ls -ltr `find . -type f `
    

    它将为您提供所有文件的长列表,底部是最新的。

    【讨论】:

    • 不错的主意。你也可以只用 tail 读取最后一行并直接将其通过管道传输到 md5sum ......但是它使用 find 读取所有文件并将它们传递给 ls,这很快就会以 /bin/ 的“参数列表太长”错误结束ls。当然你可以提高限制,但是围绕如此庞大的数据进行管道传输可能是有问题的......还有一个用于 ls 的递归开关,问题是排序只适用于每个目录而不是整体:/
    【解决方案3】:

    尝试查看 inotify 包,以便在目录中发生修改时通知您。

    【讨论】:

    • 我知道 inotify 支持,但我希望不需要在后台持续运行但可以在每次页面加载时高效处理。
    • @Joe Hopfgartner :我在 python 和 C 中使用 inotify,一个线程监听内核通知,这非常有效;)但我没有做网络服务器......
    【解决方案4】:

    我从来没用过,但显然是there is inotify support for PHP

    (inotify 将是 Linux 下获取通知的最有效方式)

    【讨论】:

    • 我知道 inotify 支持,但我希望不需要在后台持续运行但可以在每次页面加载时高效处理。
    猜你喜欢
    • 2012-01-31
    • 2010-09-11
    • 2010-10-20
    • 1970-01-01
    • 2021-08-18
    • 2013-02-03
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多