php как правильно использовать экземпляры inotify для мониторинга каталога

#php #mysql #events #directory #inotify

#php #mysql #Мероприятия #каталог #inotify

Вопрос:

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

Заранее благодарю вас.

Комментарии:

1. Подумайте incron : выполнение всего этого на PHP может быть излишним.

Ответ №1:

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

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

Комментарии:

1. Единственное, что меня беспокоит по этому поводу, связано с тем, что я не совсем понимаю, как работает экземпляр inotify listener. Если $events находит событие create и начинает выполнение оставшихся функций, и за это время создается другой файл, будет ли следующая итерация $events видеть этот вновь созданный файл? В принципе, созданные файлы помещаются в очередь? или $events нужно «следить» за файлом, чтобы его увидеть?

2. И если на то пошло — событие удаляется из очереди, как только оно используется $event ? Если нет, то как мне не использовать то же событие снова?

Ответ №2:

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

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

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

Комментарии:

1. Под «сгенерированным событием» вы подразумеваете событие, которое я указываю экземпляру inotify_watch для выполнения? Например, событием может быть функция, которая считывает файл, анализирует содержимое, записывает данные в mysql и удаляет файл?

2. Я вижу, вы обновили свой вопрос, и вы правильно получаете событие (присвоив его $events). Я бы проверил, какая информация хранится в $events посредством var_dump . Напишите отдельную функцию (которая принимает имя файла в качестве параметра) для открытия, чтения, создания инструкции insert и удаления файла. Эти функции являются отдельными и должны быть в отдельной функции. Они не отличаются от стандартных операций ввода-вывода файлов в PHP.

3. Спасибо EvilChookie и TML за помощь, пожалуйста, посмотрите и прокомментируйте мой ответ ниже.