【问题标题】:PHP Inotify - Determine Bit Mask from Integer ValuePHP Inotify - 从整数值确定位掩码
【发布时间】:2013-12-14 17:38:41
【问题描述】:

我正在开发一个用 PHP 编写的文件监控守护程序,使用 inotify PECL 扩展名。我几乎完成了,因为它告诉我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

【问题讨论】:

  • 嗯...我正在尝试一种优雅的方式来做到这一点。您是否考虑过创建一个包含所有常量名称的数组,然后循环并比较直到找到正确的 foreach 循环,格式为 $key => $value ?
  • 有个主意.. 我可以试试。另一方面,我可以告诉程序要监听哪些事件,所以我考虑重复运行它,每次都切换出要监听的标志,并记录值。但是有很多标志要听...:P
  • 当然!由于我们正在讨论监视文件系统,因此我只是想找出绝对最好的方法。
  • 我会试试你的建议,让你知道它是如何工作的。一个快速的问题,如果inotify 每个事件返回多个标志(我确实怀疑),你知道我如何有效地找出触发它的标志吗?
  • 嘿,你的建议很有效。我创建了一个关联数组,其中键是实际标志,值是文本名称。如果您将其发布为答案,我会接受它,因为您给了我这个想法。我所要做的就是echo $this->_allFlags[ $evt['mask'] ]

标签: php inotify bitflags


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多