borrame.com - Colección particular de recortes de código y documentación para programación web

Canales RSS

Lo más fresco

  1. Bookmarklets Nuevo
  2. Recetario básico para CakePHP/2 Nuevo
  3. Certificado auto-firmado Nuevo

Sugerencias del chef

Lo más visitado

  1. Fecha y hora
  2. Dar formato a un número
  3. Reiniciar secuencia
  4. Vaciar un esquema
  5. Certificado auto-firmado
Compartir esta página

Limpiar temporales

No me gusta dejar mis temporales en el directorio por defecto del sistema (me parece como compartir la esponja del baño con los vecinos del bloque) pero si no eres cuidadoso te puedes encontrar años de PDFs generados el día que te conectes al FTP por casualidad.

La siguiente clase se puede utilizar para hacer limpieza y eliminar los archivos que no se han modificado en cierto tiempo.

<?php /** * Clase para gestionar el borrado de archivos temporales * * @version 2013-11-29 * * @todo Posibilidad de omitir una ruta concreta o una máscara (comodines o expresión regular) */ class LimpiarTemporales{     /**      * Ruta en disco del directorio que se desea limpiar      * @var string      */     private $directorio;     /**      * Lista negra de nombres de directorio      * @var string[]      */     private $omitir_directorios = array();     /**      * Lista negra de nombres de archivo      * @var string[]      */     private $omitir_archivos = array();     /**      * @param string $directorio Directorio en disco que deseamos limpiar      */     public function __construct($directorio){         if( is_dir($directorio) && is_writable($directorio) ){             $this->directorio = $directorio;         }else{             throw new Exception('No se puede escribir en el directorio temporal indicado: ' . $directorio);         }     }     /**      * Indicamos que no se debe descender a los directorios con un nombre determinado      *      * @param string $nombre Nombre de directorio (no es una ruta ni admite comodines)      */     public function omitirDirectorios($nombre){         $this->omitir_directorios[] = $nombre;     }     /**      * Indicamos que no deben eliminarse los archivos con un nombre determinado      *      * @param string $nombre Nombre de archivo (no es una ruta ni admite comodines)      */     public function omitirArchivos($nombre){         $this->omitir_archivos[] = $nombre;     }     /**      * Efectúa la limpieza del directorio      *      * @param int $segundos Tiempo en segundos      */     public function limpiar($segundos){         clearstatcache();         $this->eliminarAntiguos($segundos, $this->directorio);     }     /**      * Elimina los directorios vacíos y los archivos que no hayan sido modificados en el tiempo indicado      *      * @param int $segundos Tiempo en segundos      * @param string $directorio Subdirectorio a limpiar      */     protected function eliminarAntiguos($segundos, $directorio){         foreach(scandir($directorio) as $nombre_elemento){             $ruta_elemento = $directorio. DIRECTORY_SEPARATOR . $nombre_elemento;             if( $nombre_elemento=='.' || $nombre_elemento=='..' ){                 continue;             }elseif( is_dir($ruta_elemento) ){                 if( in_array($nombre_elemento, $this->omitir_directorios) ){                     continue;                 }             }else{                 if( in_array($nombre_elemento, $this->omitir_archivos) ){                     continue;                 }             }             /*              * Examinamos la fecha en primer lugar para que se guarde en caché. Esto nos permite saber              * la fecha real si es un directorio aunque borremos archivos del mismo (al hacerlo se modifica              * la fecha)              */             $es_antiguo = $this->esAntiguo($ruta_elemento, $segundos);             if(is_dir($ruta_elemento)){                 $this->eliminarAntiguos($segundos, $ruta_elemento);                 if( $es_antiguo && $this->esDirectorioVacio($ruta_elemento) ){                     rmdir($ruta_elemento);                 }             }elseif( $es_antiguo ){                 unlink($ruta_elemento);             }         }     }     /**      * Indica si el elemento es un directorio y está vacío      *      * @param string $ruta_elemento Ruta en disco      * @return bool      */     private function esDirectorioVacio($ruta_elemento){         if( is_dir($ruta_elemento) ){             $contenido = scandir($ruta_elemento);             return count($contenido)==2; // "." y ".."         }else{             return FALSE;         }     }     /**      * Indica si el elemento ha sido modificado hace más de $segundos      *      * @param string $ruta_elemento Ruta en disco      * @param int $segundos Tiempo en segundos      * @return bool      */     private function esAntiguo($ruta_elemento, $segundos){         $mod = filemtime($ruta_elemento);         if($mod===FALSE){             return FALSE;         }else{             return time()-$mod>$segundos;         }     } }

Se puede ejecutar en línea de comandos con una tarea programada o lanzarla aleatoriamente al iniciarse una sesión en la web.

Ejemplo de uso

Borrar los temporales olvidados, pero sin cargarse los directorios de Subversion (sí, el svn del servidor es antediluviano):

$limpieza = new LimpiarTemporales('/home/foo/app/files/tmp'); $limpieza->omitirDirectorios('.svn'); $limpieza->limpiar(86400); // 1 día

Nos basta con un mes de logs (pero dejamos un par de archivos de configuración):

$limpieza = new LimpiarTemporales($_SERVER['DOCUMENT_ROOT'] . '/logs'); $limpieza->omitirArchivos('.htaccess'); $limpieza->omitirArchivos('.gitignore'); $limpieza->limpiar(30 * 86400); // 30 días

Esta página ha sido impresa el sábado 23 de septiembre de 2017 (02:23:40 +0200) desde http://borrame.com/recortes/php/limpiar-temporales.html. La última vez que miré contenía HTML válido con CSS fresquito y si tiene flatas de ortografía ha sido sin querer.

borrame.com es el sitio anteriormente conocido como bits.demogracia.com (no confundir con Demogracia, que sólo pasaba por ahí).

© 2005-2017 by Álvaro González (alvaro.es) • Burgos (España) • borrame.com