PHP是否删除过期目录中的所有子目录?
有一个目录/home/example/public\u html/users/files/。在目录中,有随机名称的子目录,如2378232828923298295497 如何完全删除创建日期>1个月的子目录 我使用了一个很好的脚本来删除文件,但它不适用于dirs:PHP是否删除过期目录中的所有子目录?,php,directory,unlink,rmdir,Php,Directory,Unlink,Rmdir,有一个目录/home/example/public\u html/users/files/。在目录中,有随机名称的子目录,如2378232828923298295497 如何完全删除创建日期>1个月的子目录 我使用了一个很好的脚本来删除文件,但它不适用于dirs: $seconds_old = 2629743; //1 month old $directory = "/home/example/public_html/users/files/"; if( !$dirha
$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?
}
}
为此,需要一个递归函数
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);
}
如果PHP在Linux服务器上运行,则可以使用shell命令来提高性能。在非常大的目录中,递归PHP函数可能效率低下:
shell_exec'rm-rf'.$目录 您可以使用rmdir,还可以编写递归删除算法。首先,从代码中删除所有@,忘记它是php中的一个运算符。我强烈反对使用@,因为它不仅可以避免您可能希望捕获的任何错误;但这对性能来说是一个巨大的负担。@Frederico:很明显,这不是一个很大的性能下降,它很小,但是禁止错误是永远不使用它的更大原因。也许你应该提到,运行它是一个极其危险的命令,与上面的php本机实现一样危险:它们做的事情完全相同,它们做的是www数据用户或配置的Apache用户,唯一的区别是运行时间更短,即使在某些共享主机上,如果管理员禁用了shell_exec函数,也不会运行
<?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]);
}
}
?>