在PHP中删除超过2天的所有文件的正确方法

时间:2012-01-22 23:42:12

标签: php file caching

好奇的

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

我只是想确定代码是否正确。感谢。

11 个答案:

答案 0 :(得分:80)

您应该添加is_file()检查,因为PHP通常会列出. and ..,以及可能位于您正在检查的目录中的子目录。

此外,作为this answer suggests,您应该使用更具表现力的表示法替换预先计算的秒数。

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

或者您也可以使用DirectoryIteratoras shown in this answer。在这个简单的情况下,它并没有真正提供任何优势,但它将是OOP方式。

答案 1 :(得分:48)

最简单的方法是使用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());
        }
    }
}
?>

答案 2 :(得分:9)

另一种更简单,更现代的方式,使用FilesystemIterator

我正在使用&#39;日志&#39;以目录为例。

$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返回虚拟目录&#34;。&#34;和&#34; ..&#34;在一个循环中。 但FilesystemIterator会忽略它们。

答案 3 :(得分:5)

我认为这更加整洁,更易于阅读和修改。

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

答案 4 :(得分:4)

对我来说是正确的。为清楚起见,我建议您将172800替换为2*24*60*60

答案 5 :(得分:2)

请注意,如果目录中包含大量文件,则会遇到问题。

如果您认为这可能会对您产生影响,请考虑使用较低级别的方法,例如opendir

答案 6 :(得分:2)

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

希望对你有所帮助。

答案 7 :(得分:2)

这是一个如何以递归方式执行此操作的示例。

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

答案 8 :(得分:0)

EventsService

答案 9 :(得分:0)

(time()-filectime($path.$file)) < 172800 //2 days

如果当前时间和文件更改时间在172800秒以内,则。

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

好吧,如果仍然有任何混淆,您只需更改第一行代码中的运算符即可。

答案 10 :(得分:0)

@maksim-t 回答可以改进一点:

  1. 从一开始就计算最旧的“允许”,而不是在每次迭代时都计算它。
  2. 使用修改时间而不是创建时间,否则您可能会删除最近更新的文件。
  3. 使用 getPathname 而不是 getFilename,这样就不需要连接路径了。
 // Initialize and add the map
    function initMap() {
        // The location of Uluru
        let uluru;
        let markers = []
        let marker;
        let maps;
        uluru = { lat: -25.344, lng: 131.036 };
        // The map, centered at Uluru
        const map = new google.maps.Map(document.getElementById("map"), {
            zoom: 4,
            center: uluru,
        });
    
        //ajax call
        $.ajax({
            type: 'GET', //THIS NEEDS TO BE GET
            url: '/ajaxmap',
            success: function(maps) {
                maps = maps;
                for (let i = 0; i < maps.length; ++i) {
                    let uluru = {
                        lat: Number(maps[i]['latitude']),
                        lng: Number(maps[i]['longitude'])
                    };
    
                    if( maps[i]["admin_id"] == $(`#User_id`).data('id') || maps[i]["is_public"] == 1 || $(`#User_id`).data('role') == 'super' ){
                        addMarker(uluru, maps, i);
                    }
    
                }
            },
            error: function() {
                console.log(maps);
            }
        });
        
        console.log(maps);
        $("#more").click(function () {
            markersnull();
            console.log(maps);
            for (let index = 0; index < maps.length; index++) {     
                addMarker();
    
            }
        });
        function markersnull() {
            for (let index = 0; index < markers.length; index++) {
                markers[index].setMap(null);
            }
        }
    
        function addMarker(coords, maps, i) {
            marker = new google.maps.Marker({
                position: coords,
                map: map,
                icon:{
                    path: 'M 0,0 C -2,-20 -10,-22 -10,-30 A 10,10 0 1,1 10,-30 C 10,-22 2,-20 0,0 z M -2,-30 a 2,2 0 1,1 4,0 2,2 0 1,1 -4,0',
                    fillColor: maps[i]['color'],
                    fillOpacity: 1.0,
                    strokeColor: '#000000',
                    strokeWeight: 1,
                    scale: 1,
                    anchor: new google.maps.Point(12, 24),
                },
            });
            markers.push(marker);
            attachSecretMessage(marker, maps, i);
        };
        
        
    }