通过FTP添加新文件时运行PHP脚本

时间:2009-05-30 19:42:17

标签: php linux ftp

我有多台摄像机通过FTP将图像随机发送到预定的文件夹。

例如:
录音/ camera1 / images / - 用于第一台摄像机
录音/ camera2 / images / - 用于第二台摄像机

每个图像都以.jpg格式保存,然后关闭FTP连接。

每次添加新文件后我都需要调用PHP脚本。假设每当将新图像添加到/ recordings文件夹中时,我需要使用

调用php脚本
newimage.php?location=recordings/camera1/images/picture002.jpg

等等。

服务器是运行ProFTPD的Linux机箱

我如何完成这项工作?

请注意:Cron作业不是一个选项,因为会有数千个文件而且我们没有使用数据库。所以我们无法确定是否有任何新文件。

6 个答案:

答案 0 :(得分:4)

我建议你看一下ProFTPD mod_exec。 这是一个解释其目标的引文:

  

mod_exec模块可用于   执行外部程序或脚本   在过程中的各个方面   处理FTP命令。通过意识   设计,ProFTPD不会也不会   执行外部程序。这是一个   安全决定,因为它已经确定   不允许ProFTPD作为一个   危害系统的手段或   通过错误披露信息   外部程序或脚本。用于   这个模块允许这样的外部   要执行的程序,以及   打开服务器到提到的   妥协的可能性或   通过这些计划披露。

您还可以查看inotify,它可以监控系统文件活动。

答案 1 :(得分:2)

您应该在PHP中使用fam_monitor_directory函数(如果它是使用--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);

答案 2 :(得分:1)

我会制作一个每隔5或10分钟查找新文件的cronjob。然后使用wget调用PHP脚本以查找找到的任何新图像。

更新:看来你需要以某种方式挂钩ProFTPD。也许mod_exec可以提供帮助。

答案 3 :(得分:1)

您应该可以使用inotify在Linux上执行此操作。有一个PECL模块,允许PHP接收inotify事件。文档为here

答案 4 :(得分:1)

还有另一种方式。

mod_exec打开您的FTP服务器以解决安全问题。读取日志文件有时会导致服务器无法写入日志文件等。

尝试启用mod_mysql。然后启用日志记录到数据库表,这样您就可以扫描MySQL表中的更改。尝试使用MySQL和proFTPd http://www.iezzi.ch/archives/110

搜索日志记录

答案 5 :(得分:0)

如果你在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