#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 за помощь, пожалуйста, посмотрите и прокомментируйте мой ответ ниже.