Php oluşturma tarihine göre dizinden dosyaları silmek için?

4 Cevap

Ben html dosyaları saklayan bir önbellek klasörü vardır. Bunlar gerektiğinde yazılır, ama çok zaman, nadiren kullanılan sayfaları sadece (5 hafta sonra, sürücü 2.7 milyondan fazla önbellek dosyaları ile doluydu) alanı kullanarak sonuna kadar olduğunu, orada da önbelleğe alınır.

Nedir binlerce dosya yüzlerce içerir ve 1 günden daha eski olan dosyaları kaldırmak bir dizin aracılığıyla döngü için en iyi yolu nedir?

4 Cevap

Ben damgası dayalı readdir ile dizininde döngü ile bu konuda gitmek ve silme düşünüyorum:

<?php
if ($handle = opendir('/path/to/files')) {

    while (false !== ($file = readdir($handle))) { 
        $filelastmodified = filemtime($file);

        if((time() - $filelastmodified) > 24*3600)
        {
           unlink($file);
        }

    }

    closedir($handle); 
}
?>

if((time() - $filelastmodified) > 24*3600) 24 saat (24 saat Zamanlar saatte 3600 saniye) daha eski dosyaları seçmek olacaktır. Eğer gün isteseydi, bir haftadan daha eski dosyaları için * 3600 * 24 örneğin 7 okumalısınız.

Ayrıca, filemtime yerine oluşturma tarih, dosyanın son değişiklik zamanını döndürür unutmayın.

Bu olmalı

if((time()-$filelastmodified) > 24*3600 && is_file($file))

. ve .. dizinleri hataları önlemek için.

Aşağıdaki fonksiyonu kendi yaratılış tarihine göre dosya listeler:

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;
}

Example:

$_list = listdir_by_date($dir);

Şimdi listesinde döngü kendi tarihlerini görmek ve buna göre silmek için olabilir:

$now = time();
$days = 1;
foreach( $_list as $file => $exp ){
  if( $exp < $now-60*60*24*$days ){
    unlink( $dir . $file );
  }
}

Try 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;
    }
}

Creation Time is only available on Windows.