好的,我需要一个dir监视器,它不断扫描目录以添加新的.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以及实现我的目标所需的顺序都会非常有用。
提前谢谢。
答案 0 :(得分: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将参与进程阻塞(这解决了我对无限循环的关注)。
答案 1 :(得分:2)
使用inotify_read($fd)
从生成的事件中获取信息。
在php.net上有一个合理的例子:http://www.php.net/manual/en/function.inotify-init.php
对于while循环,inotify_read()将阻塞,直到有一个事件,所以它不会像一个持续旋转一样。