2009-05-30 6 views
4

Ich habe mehrere Kameras, die Bilder in zufälligen Abständen per FTP an einen vorgegebenen Ordner senden.Führen Sie PHP-Skript, wenn eine neue Datei über FTP hinzugefügt wird

Zum Beispiel:
Aufnahmen/camera1/images/- für die erste Kamera
Aufnahmen/camera2/images/- für die zweite Kamera
etc

von ihnen Format speichern Jede Bilder in .jpg und schließen FTP-Verbindung

Ich muss ein PHP-Skript nach jedem Hinzufügen einer neuen Datei aufrufen. Lassen Sie uns sagen, wann immer ein neues Bild in die hinzugefügt/Aufnahmen Ordner Ich brauche das PHP-Skript aufrufen, mit

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

und so weiter.

Der Server ist ein Linux-Box ProFTPD läuft

Wie kann ich dies getan?

Bitte beachten Sie: Cron Job ist keine Option, da es Tausende von Dateien gibt und wir keine DB verwenden. So können wir nicht herausfinden, ob es neue Dateien gibt.

+0

. Bitte beachten:. Cron Job ist keine Option, da es werden tausende von Dateien und wir eine DB nicht verwenden so können wir herausfinden, nicht, wenn es neue Dateien sind – ToughPal

Antwort

4

Ich würde Ihnen empfehlen, einen Blick auf die mod_exec von ProFTPD zu werfen. Hier ist ein Zitat sein Ziel zu erklären:

Das mod_exec Modul kann an ausführen externe Programme oder Skripte an verschiedenen Punkten im Prozess der Umgang mit FTP-Befehle verwendet werden. Durch bewusste Design, ProFTPD nicht und wird nicht externe Programme ausführen. Dies ist eine Sicherheitsentscheidung, da entschieden wurde, ProFTPD nicht als Mittel zur Kompromittierung eines Systems oder Offenlegung von Informationen über Fehler in externen Programmen oder Skripten zuzulassen. Verwendung von dieses Modul ermöglicht, dass solche externen Programme ausgeführt werden, und auch öffnet den Server zu den erwähnten Möglichkeiten der Kompromiss oder Offenlegung über diese Programme.

Sie können auch einen Blick auf inotify werfen, mit dem Sie die Systemdateiaktivität überwachen können.

+0

'inotify' Link ist defekt. Gibt es eine aktuelle Alternative dazu? –

1

Ich würde einen Cronjob machen, der alle 5 oder 10 Minuten nach neuen Dateien sucht. Dann rufen Sie das PHP-Skript mit wget für neue Bilder gefunden.

Update: Es scheint, dass Sie irgendwie in ProFTPD einhaken müssen. Vielleicht kann mod_exec helfen.

+0

Pl Hinweis: Cron-Job ist keine Option, da es Tausende von Dateien gibt und wir keine DB verwenden. So können wir nicht herausfinden, ob es neue Dateien gibt – ToughPal

+0

Okay, ich habe einen weiteren Vorschlag hinzugefügt, nachdem Sie geschrieben haben, dass crontab out war. –

1

Sie sollten inotify verwenden können, um dies unter Linux zu tun. Es gibt ein PECL-Modul, mit dem PHP inotify Ereignisse empfangen kann. Die Dokumentation ist .

1

Es gibt einen anderen Weg.

mod_exec öffnet Ihren FTP-Server zu Sicherheitsproblemen. Das Lesen der Protokolldateien kann manchmal dazu führen, dass Ihr Server nicht in die Protokolldatei usw. schreibt.

Versuchen Sie, mod_mysql zu aktivieren. Aktivieren Sie dann die Protokollierung in die Datenbanktabelle. Auf diese Weise können Sie Ihre MySQL-Tabelle auf Änderungen überprüfen. Suchen Sie nach Logging mit MySQL und proFTPd http://www.iezzi.ch/archives/110

2

Sie sollten fam_monitor_directory Funktion in PHP verwenden (wenn es mit --with-fam kompiliert wurde). Es macht genau das, was Sie brauchen, d. H. Sie führen ein PHP-Programm immer dann aus, wenn sich der Inhalt des Verzeichnisses ändert.

Verwendung so etwas wie dies in Ihrem cronjob (es spielt keine Rolle, wie viele Dateien es in dem Verzeichnis ist, die Schleife einmal für jede Änderung im Verzeichnis geht:

/* 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

danke, ich konnte keine Beispiele für die Verwendung finden. Wie kann ich angeben, welche php-Datei aufgerufen werden soll? – ToughPal

0

wenn Sie unter linux ausführen nur diesen Code

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 
Verwandte Themen