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 답변은 약간 개선될 수 있습니다.
- 모든 반복에서 계산하는 대신 가장 오래된 "허용된" 항목을 처음부터 계산합니다.
- 작성 시간 대신 수정 시간을 사용합니다. 그렇지 않으면 최근에 업데이트된 파일을 제거할 수 있습니다.
- 경로를 연결할 필요가 없도록 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
'programing' 카테고리의 다른 글
Angular 8 응용 프로그램에서 Internet Explorer를 지원하려면 어떻게 해야 합니까? (0) | 2023.07.28 |
---|---|
오름차순 및 내림차순 정렬에 의한 MYSQL 순서 (0) | 2023.07.28 |
전체 텍스트 파일을 C의 문자 배열로 읽는 중 (0) | 2023.07.28 |
누가 아약스와 휴식의 차이점을 설명해 줄 수 있습니까? (0) | 2023.07.28 |
사용자가 로그인한 후 Larvel 5 세션이 유지되지 않음 (0) | 2023.07.28 |