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.