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
class LimpiarTemporales{
private $directorio;
private $omitir_directorios = array();
private $omitir_archivos = array();
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);
}
}
public function omitirDirectorios($nombre){
$this->omitir_directorios[] = $nombre;
}
public function omitirArchivos($nombre){
$this->omitir_archivos[] = $nombre;
}
public function limpiar($segundos){
clearstatcache();
$this->eliminarAntiguos($segundos, $this->directorio);
}
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;
}
}
$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);
}
}
}
private function esDirectorioVacio($ruta_elemento){
if( is_dir($ruta_elemento) ){
$contenido = scandir($ruta_elemento);
return count($contenido)==2;
}else{
return FALSE;
}
}
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);
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);