php中如何根据创建日期从目录中删除文件?

xwbd5t1u  于 2023-02-15  发布在  PHP
关注(0)|答案(8)|浏览(151)

我有一个缓存文件夹,存储html文件。他们被覆盖时,需要的,但很多时候,很少使用的页面缓存在那里也,只是结束使用空间(5周后,驱动器已满超过270万缓存文件)。
什么是最好的方法来循环通过一个目录,包含几十万个文件,并删除文件是旧的1天?

oxosxuxt

oxosxuxt1#

我认为您可以通过使用readdir循环目录并根据时间戳删除来完成此操作:

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

if((time() - $filelastmodified) > 24*3600)将选择24小时以上的文件(24小时乘以每小时3600秒)。如果您想要天,则对于一周以上的文件,它应该读取例如7243600。
另外,请注意filemtime返回文件的上次修改时间,而不是创建日期。

tf7tbtn2

tf7tbtn22#

应该是

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

以避免...目录出现错误。

bksxznpy

bksxznpy3#

以下函数根据文件的创建日期列出文件:

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;
}
    • 示例:**
$_list = listdir_by_date($dir);

现在,您可以遍历列表以查看它们的日期并相应地删除:

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

rpppsulh4#

尝试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.

vlurs2pr

vlurs2pr5#

/* 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);
    }
}

我正在使用这个,希望有帮助。另外,我在2023年2月13日更新了这个,访问:https://www.arnlweb.com/forums/server-management/efficient-php-code-for-deleting-files-delete-all-files-older-than-2-days-the-right-way/

uqzxnwby

uqzxnwby6#

注意Gordon时间比较(见上文:https://stackoverflow.com/a/2205833/1875965)是与“天”而不是“24小时”比较时唯一正确的值,因为并非所有天都有24小时(夏季/冬季等)。
例如,使用

// setup timezone and get timestamp for yesterday
date_default_timezone_set('Europe/Berlin'); // change as appropriate
$yesterday = strtotime('-1 day', time());

当比较文件日期时。
这可能不是一个大问题,但当您使用周/月等时,可能会导致意外的行为。我发现最好坚持使用上述方法,因为它会使任何涉及日期/时间的过程保持一致,并避免混淆。
还要检查文件日期的时区,因为有时PHP的默认时区与系统时区不同。
问候你桑德拉。

jxct1oxe

jxct1oxe7#

$directory = $_SERVER['DOCUMENT_ROOT'].'/pathfromRoot/';

$files = array_slice(scandir($directory), 2);
foreach($files as $file)
{
    // $extension      = substr($file, -3, 3); 
    // if ($extension == 'jpg') // in case you only want specific files deleted
    // {
    $stat = stat($directory.$file);
    $filedate = date_create(date("Y-m-d", $stat['ctime']));
    $today = date_create(date("Y-m-d"));
    $days = date_diff($filedate, $today, true);
    // dd($days);
    if ($days->days > 180) 
    { 
        unlink($directory.$file);
    }
     // } 
}
smtd7mpg

smtd7mpg8#

通过修改@pawel的解决方案,我创建了下面的函数。一开始我忘了在文件名中添加“路径”,这花了我半个小时才找到。

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

相关问题