PHP Inotify - 从整数值确定位掩码

时间:2013-12-14 17:38:41

标签: php inotify bitflags

我正在使用inotify PECL扩展来编写用PHP编写的文件监视守护进程。我几乎完成了它,因为它告诉我何时发生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仍然缺乏经验,所以对我很轻松。

Full List of inotify Flags

1 个答案:

答案 0 :(得分:0)

这真的不是我能想到的最优雅的解决方案,因为我们谈论的是一个可能经常发生的事件,并且难以提出一个适当的策略来处理不断的模型更改,观察文件系统的变化, 。这是我处理这种事情的强力方法。

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

怎么办?好吧,将数值字符串化以创建一个关联数组,其中数值是键,命名常量是值。这个数组只是各种各样的占位符,并不打算进行修改,所以尽量保持它不变。你不能将数组声明为常量,但有一些hacks可以这样做。我还建议将其设置为静态,以便只存在一个副本,并查看是否可以找到一种方法来最大化结构中的搜索时间。这可能取决于您的文件系统更改的数量以及您需要在阵列上执行的查找次数,但只要PHP在其哈希表中做得很好并且在O(1)时间保持关联数组,您就应该是安全的。

注意:以防万一您的密钥问题与内存有关:The scoop on PHP array sizes