【发布时间】: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_ATTRIB 或IN_ACCESS,cookie 是一个唯一 ID,用于将这个事件连接到另一个事件队列,name 是被更改的目录或文件。 name 仅在inotify 正在监视目录时给出。
我的问题是如何根据给定的mask 值确定是什么位掩码触发了事件?我在处理 Bit Masks 方面仍然相当缺乏经验,所以请放轻松。
【问题讨论】:
-
嗯...我正在尝试一种优雅的方式来做到这一点。您是否考虑过创建一个包含所有常量名称的数组,然后循环并比较直到找到正确的 foreach 循环,格式为 $key => $value ?
-
有个主意.. 我可以试试。另一方面,我可以告诉程序要监听哪些事件,所以我考虑重复运行它,每次都切换出要监听的标志,并记录值。但是有很多标志要听...:P
-
当然!由于我们正在讨论监视文件系统,因此我只是想找出绝对最好的方法。
-
我会试试你的建议,让你知道它是如何工作的。一个快速的问题,如果
inotify每个事件返回多个标志(我确实怀疑),你知道我如何有效地找出触发它的标志吗? -
嘿,你的建议很有效。我创建了一个关联数组,其中键是实际标志,值是文本名称。如果您将其发布为答案,我会接受它,因为您给了我这个想法。我所要做的就是
echo $this->_allFlags[ $evt['mask'] ]