2009-05-30 102 views
4

我有多臺攝像機通過FTP以隨機間隔將圖像發送到預定文件夾。當通過FTP添加新文件時運行PHP腳本

例如:
錄音/攝像機1 /圖像/ - 對於第一相機
錄音/ camera2 /圖像/ - .jpg格式爲第二相機

它們中的每保存圖像,然後關閉FTP連接。

我需要每次添加新文件的時間後調用PHP腳本。比方說,每當一個新的圖像添加到/錄音文件夾,我需要調用PHP腳本

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

等。

服務器是一臺Linux機器上運行的ProFTPD

如何,我可以完成這件事?

請注意:cron作業是不是一種選擇,因爲會有成千上萬的文件,我們沒有使用DB。所以我們無法確定是否有新文件。

+0

請注意:cron作業是不是就會有成千上萬的文件,我們沒有使用DB因此,我們不能找出是否有任何新文件的選項 – ToughPal 2009-05-30 19:51:34

回答

4

我建議你看一看的ProFTPD的mod_exec。 這裏引用解釋其目標:

的mod_exec模塊可用於 在 處理FTP命令的過程中執行外部程序或者在不同的點腳本 。通過有意識的設計,ProFTPD不會並且不會 執行外部程序。這是一個 安全決定,因爲決定 不允許ProFTPD充當 損害系統的方式或 通過 中的錯誤披露信息外部程序或腳本。使用 這個模塊允許執行這樣的外部 程序,並且 通過這些程序打開服務器到提及的可能性或 泄露的可能性。

您還可以看看inotify,它可以讓您監視系統文件活動。

+0

`inotify`鏈接已損壞。是否有最新的替代方案? – 2014-06-09 22:37:53

1

我會做一個cronjob看起來爲新文件,每5分鐘或10分鐘。然後調用PHP腳本wget找到任何新圖像。

更新:看來你需要以某種方式掛鉤到ProFTPD。也許mod_exec可以幫助。

+0

PL簡單說明:Cron作業不是一個選項,因爲會有數千個文件,而且我們沒有使用數據庫。因此,我們無法確定是否有任何新文件 – ToughPal 2009-05-30 19:51:49

+0

好的,在您編寫crontab出來後,我又添加了一條建議。 – 2009-05-30 20:00:16

1

您應該能夠使用的inotify做到這一點在Linux上。有一個允許PHP接收inotify事件的PECL模塊。該文檔是here

1

還有一種方法。

mod_exec打開你的FTP服務器的安全問題。讀取日誌文件有時會導致服務器無法寫入日誌文件等。

嘗試啓用mod_mysql。然後啓用日誌記錄到數據庫表,這樣你就可以掃描你的MySQL表的變化。嘗試搜索使用MySQL和ProFTPD的http://www.iezzi.ch/archives/110

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); 
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