首页 > Web开发 > 详细

php使用inotify扩展监控文件变化

时间:2019-05-14 19:49:25      阅读:241      评论:0      收藏:0      [点我收藏+]

一、安装inotify扩展

1、下载inotify扩展源码

https://pecl.php.net/package/inotify

对于php7以上版本,请下载 inotify-2.0.0.tgz。

2、编译安装

tar xf inotify-2.0.0.tgz
cd inotify-2.0.0
/data/nmp/php/bin/phpize
./configure --with-php-config=/data/nmp/php/bin/php-config
make && make install

3、修改php.ini,添加

extension = inotify.so

  

二、使用inotify进行文件监控

php的inotify扩展提供了监控文件或目录的功能,可以用来实现,服务的热更新,或安全监控。

inotify一共提供了5个函数:

1、inotify_init() 用于初始化一个实例,返回的是一个 stream 资源对象,可以被标准stream函数使用,如stream_set_blocking()。

2、inotify_add_watch() 将一个文件或目录添加到监控列表中,如果存在,则替换。

3、inotify_read() 从 inotify 实例中读取事件,如果没有返回false,如果有,返回一个 inotify 事件数组。

4、inotify_queue_len() 返回队列中事件的个数,可以理解为系统把 inotify_add_watch 关注的事件一个个加入队列,通过 inotify_read() 读取事件。

5、inotify_rm_watch() 取消监控。

一个简单的阻塞监控代码:

<?php

//初始化一个inotify实例
$fd = inotify_init();

//设置为阻塞模式
stream_set_blocking($fd, 1);

//事件掩码
$eventMask = [
    IN_ACCESS => ‘File was accessed (read)‘,
    IN_MODIFY => ‘File was modified‘,
    IN_ATTRIB => ‘Metadata changed‘,
    IN_CLOSE_WRITE => ‘File opened for writing was closed‘,
    IN_CLOSE_NOWRITE => ‘File not opened for writing was closed‘,
    IN_OPEN => ‘File was opened‘,
    IN_MOVED_TO => ‘File moved into watched directory‘,
    IN_MOVED_FROM => ‘File moved out of watched directory‘,
    IN_CREATE => ‘File or directory created in watched directory‘,
    IN_DELETE => ‘File or directory deleted in watched directory‘,
    IN_DELETE_SELF => ‘Watched file or directory was deleted‘,
    IN_MOVE_SELF => ‘Watch file or directory was moved‘,
    IN_CLOSE => ‘Equals to IN_CLOSE_WRITE | IN_CLOSE_NOWRITE‘,
    IN_MOVE => ‘Equals to IN_MOVED_FROM | IN_MOVED_TO‘,
    IN_ALL_EVENTS => ‘Bitmask of all the above constants‘,
    IN_UNMOUNT => ‘File system containing watched object was unmounted‘,
    IN_Q_OVERFLOW => ‘Event queue overflowed (wd is -1 for this event)‘,
    IN_IGNORED => ‘Watch was removed (explicitly by inotify_rm_watch() or because file was removed or filesystem unmounted‘,
    IN_ISDIR => ‘Subject of this event is a directory‘,
    IN_ONLYDIR => ‘Only watch pathname if it is a directory‘,
    IN_DONT_FOLLOW => ‘Do not dereference pathname if it is a symlink‘,
    IN_MASK_ADD => ‘Add events to watch mask for this pathname if it already exists‘,
    IN_ONESHOT => ‘Monitor pathname for one event, then remove from watch list.‘,
    1073741840 => ‘High-bit: File not opened for writing was closed‘,
    1073741856 => ‘High-bit: File was opened‘,
    1073742080 => ‘High-bit: File or directory created in watched directory‘,
    1073742336 => ‘High-bit: File or directory deleted in watched directory‘,
];

//添加监控,修改,创建,删除事件
$watch = inotify_add_watch($fd, ‘./tmp‘, IN_MODIFY | IN_CREATE | IN_DELETE | IN_ISDIR);

//读取事件
while ($events = inotify_read($fd)) {
    echo date(‘Y-m-d H:i:s‘), PHP_EOL;
    foreach ($events as $event) {
        $eventName = isset($eventMask[$event[‘mask‘]]) ? $eventMask[$event[‘mask‘]] : ‘‘;
        echo $event[‘name‘], PHP_EOL;
        echo $eventName, PHP_EOL;
    }
}

//取消监控
inotify_rm_watch($fd, $watch);

//关闭资源
fclose($fd);

  

php使用inotify扩展监控文件变化

原文:https://www.cnblogs.com/jkko123/p/10861236.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!