php как правильно использовать экземпляры inotify для мониторинга dir - PullRequest
3 голосов
/ 28 октября 2011

Хорошо, мне нужен dir-монитор, который постоянно сканирует 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 и последовательности, необходимой для достижения моей цели, была бы очень полезна.

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 28 октября 2011

Хорошо, вот что у меня так далеко (мысли?):

$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).

2 голосов
/ 28 октября 2011

Используйте inotify_read($fd) для получения информации о сгенерированном событии.

На php.net есть разумный пример: http://www.php.net/manual/en/function.inotify-init.php

Что касается цикла while, inotify_read () будетблокировать до тех пор, пока не произойдет событие, поэтому не будет происходить постоянное вращение.

...