4

好的,我需要一个目录监视器,它可以不断扫描目录以查找添加的新 .txt 文件。打开 .txt 文件,读取/解析内容并将数据写入 mysql 表。我正在研究 inotify ,它看起来很健壮并且可以完成这项任务,但我不知道命令序列将如何完成我上面提到的任务。

这是一个潜在的例子(告诉我我是否正确地考虑了这个):

$fd = inotify_init();
$watch_descriptor = inotify_add_watch($fd, '/some/system/dir/', IN_CREATE);
// Loop forever (never break out of loop since I want to ALWAYS monitor this dir)
while (true) {
    $events = inotify_read($fd);
    //THIS IS WHERE I DON'T KNOW HOW TO OPEN THE NEWLY CREATED FILE
    //PLEASE HELP HERE WITH HOW TO SUCCESSFULLY CREATE THE EVENT ACTIONS
    /*
     1) OPEN FILE
     2) READ/PARSE CONTENTS
     3) CREATE MYSQL INSERT STATEMENT
     4) DELETE FILE
    */

}

这带来的一个问题是:继续这个循环会永远消耗大量的处理器容量吗?并且:如果是这样,这真的是我应该用来实现目标的方法吗?

任何帮助理解 inotify 和完成我的目标所需的顺序都会非常有帮助。

先感谢您。

4

2 回答 2

3

好吧,这就是我到目前为止所得到的(想法?):

$dir = '/some/system/dir/';
//create mysql database connection here

$fd = inotify_init();
$watch_descriptor = inotify_add_watch($fd, $dir, IN_CREATE);
while (true) {
    $events = inotify_read($fd);
    $filepath = $dir . $events['name'];
    $contents = file_get_contents( $filepath );
    //parse contents and insert records into mysql table (thats the easy part)
    unlink( $filepath );
}
//close mysql database connection here
inotify_rm_watch($fd, $watch_descriptor);
fclose($fd);

我还注意到,当没有触发事件以释放系统内存和处理器容量时,inotify 将参与进程阻塞(这解决了我对无限 while 循环的担忧)。

于 2011-10-28T03:30:23.173 回答
2

用于inotify_read($fd)从生成的事件中获取信息。

在 php.net 上有一个合理的例子:http ://www.php.net/manual/en/function.inotify-init.php

至于 while 循环, inotify_read() 将阻塞,直到有事件发生,所以它不像会持续旋转。

于 2011-10-28T02:01:09.363 回答