PHP Conference Japan 2024

inotify_init

(PECL inotify >= 0.1.2)

inotify_init初始化 inotify 实例

描述

inotify_init(): 资源|false

初始化一个 inotify 实例,用于与 inotify_add_watch() 一起使用。

参数

此函数没有参数。

返回值

一个流资源,或者在出错时返回 false

范例

示例 #1 inotify 的示例用法

<?php
// 打开一个 inotify 实例
$fd = inotify_init();

// 监视 __FILE__ 的元数据更改(例如 mtime)
$watch_descriptor = inotify_add_watch($fd, __FILE__, IN_ATTRIB);

// 生成一个事件
touch(__FILE__);

// 读取事件
$events = inotify_read($fd);
print_r($events);

// 以下方法允许在不阻塞 inotify_read() 的情况下使用 inotify 函数:

// - 在 $fd 上使用 stream_select():
$read = array($fd);
$write = null;
$except = null;
stream_select($read,$write,$except,0);

// - 在 $fd 上使用 stream_set_blocking()
stream_set_blocking($fd, 0);
inotify_read($fd); // 不阻塞,如果没有任何事件待处理则返回 false

// - 使用 inotify_queue_len() 检查事件队列是否非空
$queue_len = inotify_queue_len($fd); // 如果 > 0,inotify_read() 将不会阻塞

// 停止监视 __FILE__ 的元数据更改
inotify_rm_watch($fd, $watch_descriptor);

// 关闭 inotify 实例
// 如果这还没有完成,这可能会关闭所有监视
fclose($fd);

?>

以上示例将输出类似于以下内容的结果

array(
  array(
    'wd' => 1,     // Equals $watch_descriptor
    'mask' => 4,   // IN_ATTRIB bit is set
    'cookie' => 0, // unique id to connect related events (e.g. 
                   // IN_MOVE_FROM and IN_MOVE_TO events)
    'name' => '',  // the name of a file (e.g. if we monitored changes
                   // in a directory)
  ),
);

参见

添加注释

用户贡献的注释 1 条注释

19
david dot schueler at tel-billig dot de
14 年前
使用 inotify 来跟踪文件(类似于 tail -f)的示例。
<?php
/**
* 文件尾部监控 (仅限UNIX!)
* 使用inotify监控文件变化并返回更改的数据
*
* @param string $file - 要监控的文件名
* @param integer $pos - 文件中的当前位置
* @return string
*/
function tail($file,&$pos) {
// 获取文件大小
if(!$pos) $pos = filesize($file);
// 初始化inotify实例
$fd = inotify_init();
// 监控$file的更改。
$watch_descriptor = inotify_add_watch($fd, $file, IN_ALL_EVENTS);
// 循环监控 (下方有中断)
while (true) {
// 读取事件 (inotify_read是阻塞的!)
$events = inotify_read($fd);
// 循环处理发生的事件
foreach ($events as $event=>$evdetails) {
// 对事件类型做出反应
switch (true) {
// 文件被修改
case ($evdetails['mask'] & IN_MODIFY):
// 停止监控$file的更改
inotify_rm_watch($fd, $watch_descriptor);
// 关闭inotify实例
fclose($fd);
// 打开文件
$fp = fopen($file,'r');
if (!
$fp) return false;
// 定位到上次EOF位置
fseek($fp,$pos);
// 读取到EOF
while (!feof($fp)) {
$buf .= fread($fp,8192);
}
// 将新的EOF保存到$pos
$pos = ftell($fp); // (记住:$pos 是引用调用)
// 关闭文件指针
fclose($fp);
// 返回新数据并退出函数
return $buf;
// 保持良好的编程习惯 ;-)
break;

// 文件被移动或删除
case ($evdetails['mask'] & IN_MOVE):
case (
$evdetails['mask'] & IN_MOVE_SELF):
case (
$evdetails['mask'] & IN_DELETE):
case (
$evdetails['mask'] & IN_DELETE_SELF):
// 停止监控$file的更改
inotify_rm_watch($fd, $watch_descriptor);
// 关闭inotify实例
fclose($fd);
// 返回失败
return false;
break;
}
}
}
}

// 使用方法如下:
$lastpos = 0;
while (
true) {
echo
tail($file,$lastpos);
}
?>
To Top