programing

PHP에서 2일보다 오래된 모든 파일을 삭제하는 올바른 방법

megabox 2023. 7. 28. 21:55
반응형

PHP에서 2일보다 오래된 모든 파일을 삭제하는 올바른 방법

그냥 궁금할 뿐입니다.

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

나는 단지 코드가 맞는지 확인하고 싶습니다.감사해요.

하위 디렉터리가 확인 중인 디렉터리에 있을 수 있으므로 확인란을 추가해야 합니다.

또한 이 답변에서 알 수 있듯이 사전 계산된 초를 보다 표현적인 표기법으로 대체해야 합니다.

$files = glob(cacheme_directory() . '*');
$threshold = strtotime('-2 day');
  
foreach ($files as $file) {
    if (is_file($file)) {
        if ($threshold >= filemtime($file)) {
            unlink($file);
        }
    }
}

또는 다음을 사용할 수도 있습니다.DirectoryIterator 답에 나타난 바와 같이이 간단한 경우에는 아무런 이점도 제공하지 않지만 OOP 방식일 것입니다.

가장 쉬운 방법은 디렉터리를 사용하는 것입니다.반복기:

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보다 유리한DirectoryIterator가상 디렉터리를 무시한다는 점에서.그리고....

디렉터리 사용logs예를 들어,

$fileSystemIterator = new FilesystemIterator('logs');
$now = time();
$threshold = strtotime('-2 day');
foreach ($fileSystemIterator as $file) {
    if ($threshold >= $file->getCTime()) {
        unlink('logs/'.$file->getFilename());
    }
}

저는 이것이 훨씬 더 깔끔하고 읽기 쉽고 수정하기 쉽다고 생각합니다.

$expire = strtotime('-7 DAYS');

$files = glob($path . '/*');

foreach ($files as $file) {

    // Skip anything that is not a file
    if (!is_file($file)) {
        continue;
    }

    // Skip any files that have not expired
    if (filemtime($file) > $expire) {
        continue;
    }

    unlink($file);
}
/* 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);
    }
}

도움이 되길 바랍니다.

2023년에 이 코드를 업데이트했습니다. 확인해 보십시오. https://www.arnlweb.com/forums/server-management/efficient-php-code-for-deleting-files-delete-all-files-older-than-2-days-the-right-way/

제가 보기엔 맞는 것 같아요.당신이 대체할 것을 제안합니다.172800와 함께2*24*60*60알기 쉽게

다음은 재귀적으로 수행하는 방법의 예입니다.

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

디렉터리에 파일이 너무 많으면 문제가 발생합니다.

이 문제가 영향을 미칠 가능성이 높다고 생각되는 경우와 같은 하위 수준의 접근 방식을 사용하는 것이 좋습니다.

@막심-t 답변은 약간 개선될 수 있습니다.

  1. 모든 반복에서 계산하는 대신 가장 오래된 "허용된" 항목을 처음부터 계산합니다.
  2. 작성 시간 대신 수정 시간을 사용합니다. 그렇지 않으면 최근에 업데이트된 파일을 제거할 수 있습니다.
  3. 경로를 연결할 필요가 없도록 getFilename 대신 getPathname을 사용합니다.
#Initiate iterator
$fileSI = new FilesystemIterator($this->files);
#Get the oldest allowed time
$oldest = time() - ($maxFileAge * 86400);
#Iterate the files
foreach ($fileSI as $file) {
    #Check time
    if ($file->getMTime() <= $oldest) {
        #Remove the file
        @unlink($file->getPathname());
    }
} 
/** 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);
    }
}
(time()-filectime($path.$file)) < 172800 //2 days

현재 시간과 파일이 변경된 시간은 172800초 이내입니다.

 if (preg_match('/\.pdf$/i', $file)) {
     unlink($path.$file);
 }

그래도 혼란이 있다면 코드의 첫 줄부터 연산자를 변경하면 됩니다.

언급URL : https://stackoverflow.com/questions/8965778/the-correct-way-to-delete-all-files-older-than-2-days-in-php

반응형