2009-05-30 6 views
4

J'ai plusieurs caméras qui envoient des images à intervalles aléatoires via FTP vers un dossier prédéterminé.Exécution d'un script PHP lors de l'ajout d'un nouveau fichier via FTP

Par exemple:
enregistrements/camera1/images/- pour la première caméra
enregistrements/camera2/images/- pour la deuxième caméra
etc

Chacun d'eux enregistrer des images au format .jpg et puis fermez Connexion FTP.

Je dois appeler un script PHP après chaque ajout d'un nouveau fichier. Disons que chaque fois qu'une nouvelle image est ajoutée dans le répertoire/enregistrements dossier que je dois appeler le script php avec

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

et ainsi de suite.

Le serveur est une machine Linux ProFTPD

Comment puis-je obtenir ce fait?

Veuillez noter: Cron travail n'est pas une option car il y aura des milliers de fichiers et nous n'utilisons pas de base de données. Nous ne pouvons donc pas savoir s'il y a de nouveaux fichiers.

+0

S'il vous plaît noter:.. emplois Cron est pas une option car il y aura des milliers de fichiers et nous n'utilisons un DB nous ne pouvons pas savoir s'il y a des nouveaux fichiers – ToughPal

Répondre

4

Je vous conseille de jeter un oeil à la mod_exec de ProFTPD. Voici une citation expliquant son objectif:

Le module mod_exec peut être utilisé pour exécuter des programmes externes ou scripts à différents points dans le processus de traitement des commandes FTP. Par la conception consciente , ProFTPD ne fait pas et ne exécuter des programmes externes. Il s'agit d'une décision de sécurité , car il a été décidé de ne pas permettre à ProFTPD de servir de pour compromettre un système ou de divulguer des informations via des bogues dans des programmes ou scripts externes . Utilisation de ce module permet de tels programmes externes à exécuter, et aussi ouvre le serveur aux possibilités de compromis mentionné ou la divulgation via ces programmes.

Vous pouvez également jeter un oeil à inotify qui vous permet de surveiller l'activité du fichier système.

+0

Le lien 'inotify' est rompu. Y a-t-il une alternative à jour? –

1

Je voudrais faire un cronjob qui cherche de nouveaux fichiers toutes les 5 ou 10 minutes. Ensuite, appelez le script PHP avec wget pour toutes les nouvelles images trouvées.

Mise à jour: Il semble que vous ayez besoin de vous connecter à ProFTPD d'une manière ou d'une autre. Peut-être mod_exec peut être utile.

+0

Pl note de facilité: Cron travail n'est pas une option car il y aura des milliers de fichiers et nous n'utilisons pas une base de données. Donc, nous ne pouvons pas savoir s'il y a de nouveaux fichiers – ToughPal

+0

Bon, j'ai ajouté une autre suggestion après que vous ayez écrit que crontab était sorti. –

1

Vous devriez pouvoir utiliser inotify pour faire cela sous Linux. Il existe un module PECL qui permet à PHP de recevoir des événements inotify. La documentation est here.

1

Il existe un autre moyen. Mod_exec ouvre votre serveur FTP à des problèmes de sécurité. La lecture des fichiers journaux peut parfois empêcher votre serveur d'écrire dans le fichier journal, etc.

Essayez d'activer mod_mysql. Ensuite, activez la connexion à la table de base de données, de cette façon vous pouvez analyser votre table MySQL pour les changements. Essayez de rechercher en utilisant MySQL et proFTPd http://www.iezzi.ch/archives/110

2

Vous devez utiliser la fonction fam_monitor_directory en PHP (si elle a été compilée en utilisant --with-fam). Il fait exactement ce dont vous avez besoin, c'est-à-dire exécute un programme PHP chaque fois que le contenu du répertoire change.

Utilisez quelque chose comme ça dans votre cronjob (peu importe combien de fichiers il y a dans le répertoire, la boucle passe un temps pour chaque changement dans le répertoire:

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

merci, je ne pouvais pas trouver des exemples d'utilisation. Aussi comment spécifier quel fichier php appeler? – ToughPal

0

si vous êtes sous linux exécuter tout ce 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 
Questions connexes