0

我正在开发一个用 PHP 编写的文件监控守护程序,使用inotifyPECL 扩展。我几乎完成了它,因为它告诉我inotify事件何时发生。

的返回值inotify_read($fd)是一个如下所示的数组:

Array
(
    [0] => Array
        (
            [wd] => 2
            [mask] => 1073741840
            [cookie] => 0
            [name] => collaphoto
        )

    [1] => Array
        (
            [wd] => 2
            [mask] => 1073741856
            [cookie] => 0
            [name] => filewatcher
        )

    [2] => Array
        (
            [wd] => 2
            [mask] => 1073741840
            [cookie] => 0
            [name] => filewatcher
        )

)

如果我理解正确,每个子数组都是一个单独的事件,包含有关该事件的信息。wd是 inotify 实例的描述符,mask是触发事件的标志的整数值,例如IN_ATTRIBIN_ACCESScookie是将此事件连接到队列中另一个事件的唯一 ID,并且name是已更改的目录或文件。仅当name目录被 监视时才给出inotify

我的问题是如何根据mask给定的值确定是什么位掩码触发了事件?我在处理 Bit Masks 方面仍然相当缺乏经验,所以请放轻松。

inotify 标志的完整列表

4

1 回答 1

0

这真的不是我能想到的最优雅的解决方案,因为我们正在谈论一个可能经常发生的事件,并且很难想出一个体面的策略来处理不断的模型更改,即观察文件系统的更改。这是我处理这种事情的蛮力方法。

所以我们有一个常量的主列表(当然,它们下面都有一个值),我们有从文件系统返回的数值,需要与其中一个常量匹配。

做什么?好吧,将数值字符串化以创建一个关联数组,其中数值是键,命名常量是值。这个数组只是一个占位符,并不意味着修改,所以尽量保持它尽可能不变。您不能将数组声明为常量,但有一些技巧可以做到这一点。我还建议将其设置为静态,以便只存在一个副本,看看您是否可以找到一种方法来最大化结构中的寻道时间。这可能取决于您的文件系统更改了多少以及需要在数组上执行多少次查找,但只要 PHP 处理好其哈希表并将关联数组保持在 O(1) 时间,您就应该是安全的。

注意:以防万一您遇到内存问题,因为您的键是这样的:PHP 数组大小的独家新闻

于 2013-12-15T02:37:07.147 回答