txt - eliminar carpeta y subcarpetas php
¿Cómo eliminar archivos del directorio según la fecha de creación en php? (7)
Cambiando la solución de @ pawel creé la función a continuación. Al principio, me olvidé de agregar "ruta" al nombre del archivo, lo cual me lleva media hora en averiguarlo.
public function deleteOldFiles ($hours=24) {
$path=''cache''.DS;
if ( $handle = opendir( $path ) ) {
while (false !== ($file = readdir($handle))) {
$filelastmodified = filemtime($path.$file);
if((time()-$filelastmodified) > 24*3600 && is_file($path.$file))
{
unlink($path.$file);
}
}
closedir($handle);
}
}
Tengo una carpeta de caché que almacena archivos html. Se sobrescriben cuando es necesario, pero la mayoría de las veces, las páginas que se usan raramente también se almacenan en la memoria caché, que terminan usando espacio (después de 5 semanas, la unidad estaba llena con más de 2.7 millones de archivos de caché).
¿Cuál es la mejor manera de recorrer un directorio que contiene varios cientos de miles de archivos y eliminar los archivos que tienen más de 1 día?
Creo que puedes hacer esto en bucle a través del directorio con readdir y eliminar según la marca de tiempo:
<?php
$path = ''/path/to/files/'';
if ($handle = opendir($path)) {
while (false !== ($file = readdir($handle))) {
$filelastmodified = filemtime($path . $file);
//24 hours in a day * 3600 seconds per hour
if((time() - $filelastmodified) > 24*3600)
{
unlink($path . $file);
}
}
closedir($handle);
}
?>
El if((time() - $filelastmodified) > 24*3600)
seleccionará archivos con más de 24 horas (24 horas, 3600 segundos por hora). Si deseaba días, debería leer, por ejemplo, 7 * 24 * 3600 para archivos de más de una semana.
Además, tenga en cuenta que filemtime
devuelve la hora de la última modificación del archivo, en lugar de la fecha de creación.
Debería ser
if((time()-$filelastmodified) > 24*3600 && is_file($file))
para evitar errores de la .
y ..
directorios.
La siguiente función muestra el archivo según su fecha de creación:
private function listdir_by_date( $dir ){
$h = opendir( $dir );
$_list = array();
while( $file = readdir( $h ) ){
if( $file != ''.'' and $file != ''..'' ){
$ctime = filectime( $dir . $file );
$_list[ $file ] = $ctime;
}
}
closedir( $h );
krsort( $_list );
return $_list;
}
Ejemplo:
$_list = listdir_by_date($dir);
Ahora puede recorrer la lista para ver sus fechas y eliminarlas en consecuencia:
$now = time();
$days = 1;
foreach( $_list as $file => $exp ){
if( $exp < $now-60*60*24*$days ){
unlink( $dir . $file );
}
}
Prueba SplIterators
// setup timezone and get timestamp for yesterday
date_default_timezone_set(''Europe/Berlin''); // change to yours
$yesterday = strtotime(''-1 day'', time());
// setup path to cache dir and initialize iterator
$path = realpath(''/path/to/files''); // change to yours
$objects = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($path));
// iterate over files in directory and delete them
foreach($objects as $name => $object){
if ($object->isFile() && ($object->getCTime() < $yesterday)) {
// unlink($object);
echo PHP_EOL, ''deleted '' . $object;
}
}
solo para notar la comparación de tiempo de Gordon (ver arriba: https://.com/a/2205833/1875965 ) es la única correcta cuando se compara con "días" en lugar de "24 horas", ya que no todos los días tienen 24 horas ( verano / invierno etc).
Ej.
// setup timezone and get timestamp for yesterday
date_default_timezone_set(''Europe/Berlin''); // change as appropriate
$yesterday = strtotime(''-1 day'', time());
Al comparar la fecha del archivo.
Esto puede no ser un gran problema, pero puede llevar a un comportamiento inesperado cuando trabaja con semanas / meses, etc. Me pareció mejor seguir usando el método anterior, ya que hará que cualquier proceso que involucre fechas / horas sea consistente y evite Confusión.
También verifique cuál es la zona horaria para las fechas del archivo, ya que a veces el valor predeterminado para PHP difiere de la zona horaria del sistema.
Saludos cordiales, Sandra.
/* Detele Cache Files Here */
$dir = "cache/"; /** define the directory **/
/*** cycle through all files in the directory ***/
foreach (glob($dir."*") as $file) {
//foreach (glob($dir.''*.*'') as $file){
/*** if file is 24 hours (86400 seconds) old then delete it ***/
if (filemtime($file) < time() - 3600) { // 1 hour
unlink($file);
}
}
Estoy usando esto, espero que ayude.