Запускать скрипт PHP при добавлении нового файла через FTP - PullRequest
4 голосов
/ 30 мая 2009

У меня есть несколько камер, отправляющих изображения через произвольные интервалы через FTP в заранее определенные папки.

Например:
записи / camera1 / images / - для первой камеры
записи / camera2 / images / - для второй камеры
и т.д.

Каждый из них сохраняет изображения в формате .jpg, а затем закрывает FTP-соединение.

Мне нужно вызывать скрипт PHP после каждого добавления нового файла. Допустим, всякий раз, когда новое изображение добавляется в папку / records, мне нужно вызывать php-скрипт с

newimage.php?location=recordings/camera1/images/picture002.jpg

и т. Д.

Сервер представляет собой Linux-коробку с ProFTPD

Как я могу это сделать?

Обратите внимание: задание Cron не является опцией, так как будут тысячи файлов, и мы не используем БД. Поэтому мы не можем узнать, есть ли новые файлы.

Ответы [ 6 ]

4 голосов
/ 30 мая 2009

Я бы посоветовал вам взглянуть на mod_exec ProFTPD. Вот цитата, объясняющая его цель:

Модуль mod_exec можно использовать для выполнять внешние программы или скрипты в различных точках процесса обработка команд FTP. Сознательным дизайн, ProFTPD нет и не будет выполнять внешние программы. Это решение безопасности, как было решено не позволять ProFTPD служить в качестве средства компрометации системы или раскрытие информации через ошибки в внешние программы или скрипты. Использование этот модуль учитывает такие внешние программы, которые будут выполнены, а также открывает сервер для упомянутых Возможности компромисса или раскрытие через эти программы.

Вы также можете взглянуть на inotify , который предлагает вам отслеживать активность системных файлов.

2 голосов
/ 05 августа 2010

Вы должны использовать функцию fam_monitor_directory в PHP (если она была скомпилирована с использованием --with-fam). Он делает именно то, что вам нужно, т.е. выполняет программу PHP всякий раз, когда изменяется содержимое каталога.

Используйте что-то подобное в вашем cronjob (не важно, сколько файлов в каталоге, цикл выполняется один раз для каждого изменения в каталоге:

/* opens a connection to the FAM service daemon */
$fam_res = fam_open ();

/* The second argument is the full pathname of the directory to monitor. */
$nres = fam_monitor_directory ( $fam_res, '/home/www/example.com/cameras/');

while( fam_pending ( $fam_res ) ) {
    $arr = (fam_next_event($fam_res)) ;
    if ($arr['code']) == FAMCreated ) {
        /* deal here with the new file, which name now is stored in $arr['filename'] */
    }  
}

fam_close($fam_res);
1 голос
/ 22 июля 2010

Есть другой способ.

mod_exec открывает ваш FTP-сервер для проблем безопасности. Чтение файлов журнала иногда может привести к тому, что ваш сервер не запишет файл журнала и т. Д.

Попробуйте включить mod_mysql. Затем включите ведение журнала в таблице базы данных, чтобы вы могли сканировать таблицу MySQL на наличие изменений. Попробуйте выполнить поиск в журнале, используя MySQL и proFTPd http://www.iezzi.ch/archives/110

1 голос
/ 30 мая 2009

Вы должны быть в состоянии использовать inotify для этого в Linux. Существует модуль PECL, который позволяет PHP получать события inotify. Документация здесь .

1 голос
/ 30 мая 2009

Я бы сделал cronjob, который ищет новые файлы каждые 5 или 10 минут. Затем вызовите PHP-скрипт с wget для любых новых найденных изображений.

Обновление: Кажется, вам нужно как-то подключиться к ProFTPD. Может быть, mod_exec может помочь.

0 голосов
/ 13 августа 2015

если вы находитесь под Linux просто выполните этот код

inotifywait -m /path/to/folder -e create -e moved_to |
while read path action file; do
    echo "The file '$file' appeared in directory '$path' via '$action'"
    # do something with the file for example
    php index.php upload '$path/$file'
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...