PHP – Verificare se un file o una cartella hanno subito modifiche
In questi giorni, per necessità, ho avuto modo di scoprire alcuni metodi per gestire e tener traccia di modifiche sui file e cartelle. Molti insistono sul fatto che PHP non nasce come linguaggio adatto al controllo e gestione dei file, che dovrebbe avvenire ad un livello inferiore per mezzo di altre tecnologie. Ciò nonostante la flessibilità di cui è dotato il linguaggio fa si che si presti ugualmente a scopi del genere.
Il metodo più veloce prevede il calcolo di una stringa md5 sull’intero file, o su più file all’interno della cartella, che listati e concatenati permettono di verificare se il singolo file o la cartella, abbiano subito modifiche. (Tenendo presente che l’algoritmo MD5 può di tanto in tanto generare delle collisioni).
Un codice d’esempio veloce per calcolare e mostrare il checksum md5 di ogni file in una data cartella è questo:
<?php $files = scandir("."); // rimuoviamo le cartelle . e .. array_shift($files); array_shift($files); foreach( $files as $file ){ $md5sum = md5_file($file); echo $md5sum." ".$file."<br />"; } ?> |
Calcolare e inserire in un database il checksum md5 di un file permette di mantenere un codice univoco che identifichi il file e la sua integrità, anche in caso di ridenominazione.
Se vogliamo controllare periodicamente l’integrità di files e cartelle possiamo impostare sul server un cronjob che richiami lo script PHP adibito a ciò con un comando simile:
wget http://localhost/check_update.php |
Ogni cronjob impostato risiede in una crontab. Se stiamo usando un server condiviso e non abbiamo privilegi per impostare un cronjob, ci basta sapere che online è pieno di servizi per impostare cronjob remoti. Se abbiamo sentito parlare di Google App Script, possiamo usare i potenti Trigger forniti, impostare un tempo di controllo, la frequenza di notifiche via email, e scrivere una funzioncina come questa:
function cronJob() { /* * Realizziamo un CronJob con Google App Script */ var bersaglio = UrlFetchApp.fetch('http://url_remota.com/check_update.php').getContentText(); // L'url a cui inviare la richiesta. } |
Pubblicata l’app, il trigger a intervallo periodico eseguirà la funzione che andrà a richiamare lo script sul nostro server per un controllo sui files ed altre eventuali elaborazioni aggiuntive.
Commenti