web-dev-qa-db-ja.com

PHPで2日より古いすべてのファイルを削除する正しい方法

ちょっと興味があるんだけど

        $files = glob(cacheme_directory()."*");
        foreach($files as $file)
        {
            $filemtime=filemtime ($file);
            if (time()-$filemtime>= 172800)
            {
                unlink($file);
            }
        }

コードが正しいかどうかを確認したいだけです。ありがとう。

37
user4951

is_file() チェックを追加する必要があります。なぜなら、PHP通常はリスト .および.. 、およびチェックしているディレクトリに存在する可能性のあるサブディレクトリ。

また、 この回答が示唆するように 、事前に計算された秒をより表現力豊かな表記に置き換える必要があります。

<?php
  $files = glob(cacheme_directory()."*");
  $now   = time();

  foreach ($files as $file) {
    if (is_file($file)) {
      if ($now - filemtime($file) >= 60 * 60 * 24 * 2) { // 2 days
        unlink($file);
      }
    }
  }
?>

または、この回答に示すように、DirectoryIteratorを使用することもできます 。この単純なケースでは、実際には何の利点もありませんが、OOP way。

85
buschtoens

最も簡単な方法は、 DirectoryIterator を使用することです。

<?php
if (file_exists($folderName)) {
    foreach (new DirectoryIterator($folderName) as $fileInfo) {
        if ($fileInfo->isDot()) {
        continue;
        }
        if ($fileInfo->isFile() && time() - $fileInfo->getCTime() >= 2*24*60*60) {
            unlink($fileInfo->getRealPath());
        }
    }
}
?>

FilesystemIterator を使用した、もう1つの単純で現代的な方法。

例として「logs」ディレクトリを使用しています。

$fileSystemIterator = new FilesystemIterator('logs');
$now = time();
foreach ($fileSystemIterator as $file) {
    if ($now - $file->getCTime() >= 60 * 60 * 24 * 2) // 2 days 
        unlink('logs/'.$file->getFilename());
}

主な利点は、DirectoryIteratorが仮想ディレクトリ「。」を返すことです。ループ内の「..」。しかし、FilesystemIteratorはそれらを無視します。

9
Maksim.T

私には正しいようです。わかりやすくするために、1728002*24*60*60に置き換えることをお勧めします。

4

ディレクトリに非常に多数のファイルがある場合、問題が発生することに注意してください。

これがあなたに影響を与える可能性があると思われる場合は、 opendir などの低レベルのアプローチの使用を検討してください。

2
John Carter
/* Delete 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() - 172800) { // 2 days
    unlink($file);
    }
}

お役に立てば幸いです。

2
Lachit

再帰的に行う方法の例を次に示します。

function remove_files_from_dir_older_than_x_seconds($dir,$seconds = 3600) {
    $files = glob(rtrim($dir, '/')."/*");
    $now   = time();
    foreach ($files as $file) {
        if (is_file($file)) {
            if ($now - filemtime($file) >= $seconds) {
                echo "removed $file<br>".PHP_EOL;
                unlink($file);
            }
        } else {
            remove_files_from_dir_older_than_x_seconds($file,$seconds);
        }
    }
}

remove_files_from_dir_older_than_x_seconds(dirname(__file__).'/cache/', (60 * 60 * 24 * 1) ); // 1 day
2
user3657553
/** It deletes old files.
 *  @param string $dir Directory
 *  @param int $secs Files older than $secs seconds
 *  @param string $pattern Files matching $pattern
 */
function delete_oldfiles($dir,$secs,$pattern = "/*")
{
    $now = time();
    foreach(glob("$dir$pattern") as $f) {
      if (is_file($f) && ($now - filemtime($f) > $secs)) unlink($f);
    }
}
0
Miguel