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 条笔记

david dot schueler at tel-billig dot de
13 年前
使用 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