P4A3 framework: un helper per pulire la directory tmp in ambiente Windows

by: spadamar21-06-2008

P4A 3 Logo

Ho scritto questo piccolo “helper” per ovviare ad un piccolo inconveniente che avviene con P4A3, esclusivamente in ambiente Windows. Succede che, se viene utilizzata la funzione: P4A_Output_File(), ad esempio per generare un file pdf, il file temporaneo non viene più cancellato. Ho potuto verificare che in ambiente Linux questo non succede, e tutti i file generati vengono eliminati una volta passati al browser.

Non sono riuscito a capire esattamente il motivo ma credo che il problema risieda ancora una volta nel differente trattamento da parte di Windows dei separatori nei percorsi assoluti dei path (Windows utilizza i \ invece dei /).
Il problema, anche se può risultare fastidioso alla lunga, per l’accumularsi di un eccessivo numero di files nella directory /uploads/tmp, non è di certo grave, e soprattutto, è molto semplice da risolvere. E’ sufficiente infatti lanciare un metodo che ripulisca” la cartella dai file temporanei più vecchi di n ore (o giorni, o minuti).

Questo è il codice della funzione, che per comodità può essere gestito come “helper”, ovvero un metodo personalizzato prontamente disponibile da qualsiasi maschera della nostra applicazione:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function p4a_mask_clean_old_tmp_files($obj, $olderThan)
{
 $fileDeleted = 0;
 $expire_time = empty($olderThan[0]) || !is_numeric($olderThan[0])? 24: $olderThan[0];
 $fileTypes = array("_p4a_*","cache_*");
 if (P4A_OS == 'windows') {
  define('TEMPDIR','\tmp\\');
  $dirToClean =  P4A_UPLOADS_DIR.TEMPDIR;
  foreach ($fileTypes as $fileType){
   foreach (glob($dirToClean . $fileType) as $filename) {
   $fileCreationTime = filectime($filename);
   $fileAge = time() - $fileCreationTime;
    if ($fileAge > ($expire_time * 3600)){
     if (unlink($filename)){
      $fileDeleted++;
     }
    }
   }
  }
 }
 return $fileDeleted;
}

Il file si deve trovare nella directory /libraries all’interno della directory principale della nostra applicazione, e si deve chiamare: p4a_mask_clean_old_tmp_files.php. Il default è impostato su 24 ore.
Per cambiare la scala del tempo trascorso da ore a minuti è necessario cambiare questa riga:
if ($fileAge > ($expire_time * 3600)){
in
if ($fileAge > ($expire_time * 60)){

Il metodo viene richiamato in questo modo:

$res = clean_old_tmp_files(1); // cancella i files più vecchi di un'ora

La funzione restituisce il numero di files cancellati oppure 0

Conclusioni:

Ho già segnalato questa piccola anomalia a Fabrizio Balliano in questo commento, e credo che ben presto, magari con la release ufficiale di P4A3 annunciata per il 24/06/2008, il problema verrà risolto. Nel frattempo, gli utenti Windows, possono usare questo semplice “helper”.

Riferimenti ed approfondimenti:


Fabrizio Balliano ha scritto:

hum, io aveto testato e vedendo che funzionava correttamente non mi sono piu’ interessato alla questione, ma non sapevo che il problema fosse su windows… ora per martedi’ sara’ complicato risolverlo, vedo che posso fare.
22.06.08 11:42
Fabrizio Balliano ha scritto:

bug risolto :-)
22.06.08 13:04
Mario Spada ha scritto:

Grande Fabrizio, e a tempo di record!!