PHP удалить все подкаталоги в каталоге, срок действия которого истек? - PullRequest
0 голосов
/ 21 февраля 2011

Есть каталог /home/example/public_html/users/files/. В каталоге есть подкаталоги со случайными именами, такими как 2378232828923_1298295497.

Как полностью удалить подкаталоги с датой создания> 1 месяца?

Есть хороший скрипт, который я использую для удаления файлов, но он не работает с директориями:

$seconds_old = 2629743; //1 month old
$directory = "/home/example/public_html/users/files/";

            if( !$dirhandle = @opendir($directory) )
                        return;

             while( false !== ($filename = readdir($dirhandle)) ) {
                     if( $filename != "." && $filename != ".." ) {
                                $filename = $directory. "/". $filename;

                             if( @filectime($filename) < (time()-$seconds_old) )
                                      @unlink($filename); //rmdir maybe?
                     }
             }

Ответы [ 3 ]

0 голосов
/ 21 февраля 2011
 <?php
    $dirs = array();
    $index = array();
    $onemonthback = strtotime('-1 month');
    $handle = opendir('relative/path/to/dir');
    while($file = readdir($handle){
        if(is_dir($file) && $file != '.' && $file != '..'){
            $dirs[] = $file;
                $index[] = filemtime( 'relative/path/to/dir/'.$file );
        }
}    
closedir($handle);


    asort( $index );

    foreach($index as $i => $t) {

        if($t < $onemonthback) {
            @unlink('relative/path/to/dir/'.$dirs[$i]);
        }


}
?>
0 голосов
/ 11 февраля 2012

Если PHP работает на сервере Linux, вы можете использовать команду оболочки для повышения производительности (рекурсивная функция PHP может быть неэффективна в очень больших каталогах):

shell_exec('rm -rf '.$directory);

0 голосов
/ 21 февраля 2011

для этого нужна рекурсивная функция.

function remove_dir($dir)
{
    chdir($dir);
    if( !$dirhandle = @opendir('.') )
        return;

    while( false !== ($filename = readdir($dirhandle)) ) {
        if( $filename == "." || $filename = ".." )
            continue;

        if( @filectime($filename) < (time()-$seconds_old) ) {
            if (is_dir($filename)
                remove_dir($filename);
            else 
                @unlink($filename);
        }
    }
    chdir("..");
    rmdir($dir);
}
...