删除大量文件

时间:2012-04-04 09:54:29

标签: php linux

我的/ tmp中有8百万个文件,我需要删除它们。这个服务器也运行非常重要的应用程序,我不能超载它。

我正在使用小型PHP脚本:

<?php
$dir = "/tmp";
$dh = opendir( $dir);
$i = 0;
while (($file = readdir($dh)) !== false) {
  $file = "$dir/$file";
  if (is_file( $file) && (preg_match("/open/", $file))) {
    unlink( $file);
    #echo $file;
    if (!(++$i % 10000)) {
      echo "$i files removed\n";
    }
  }
}
?>

但它使我的应用无法访问,即使: $ ionice -c 3 php ./tmp_files_killer.php $ nice -n 20 php ./tmp_files_killer.php

我已经更改了我的脚本,所以它不会一直读取/ tmp目录:

$ ls -1 /tmp > tmp_files_list.txt

<?php
$file = "tmp_files_list.txt"; 
$infile = fopen($file, "r"); 

while ( !feof( $infile ) ) { 
  $line = rtrim( fgets( $infile ), "\n\r" ); 
  if ($line != null){ 
    $file = "$dir/$line";
    unlink( $file);
    if (!(++$i % 10000)) {
      echo "$i files removed\n";
    }
#    echo $line + "\n";
  } 
} 
?>

但运行此脚本也会降低我的应用速度。进程不加载CPU,我有足够的内存。

伙计们,如何删除这些文件?

6 个答案:

答案 0 :(得分:4)

您可以让脚本以“块”运行,然后在每个块之间休眠。

在你的第二个版本中,你可以在回声之后添加一个sleep(),比如说30秒。如果你调整删除的文件数量和睡眠时间,它应该保持服务器响应,同时仍然充分执行。

将来,您应该定期从cron运行清理工作,以阻止自己达到这一点。

答案 1 :(得分:3)

如果你可以直接在linux终端上执行命令那么这将变得非常简单,直接执行这个命令

find /tmp -type f -exec rm -v {} \;

另外如果你想定期执行这个过程,那么你可以配置一个cronjob在午夜运行,你的服务器将几乎空闲

答案 2 :(得分:1)

我会以不同的方式解决这个问题:一次性破坏整个文件系统。

创建一个新的文件系统 - 它可能是一个简单的tmpfs文件系统,它可能是一个ext2或ext3文件系统,它们位于一个环回安装的文件中,它可能是一个新驱动器(USB记忆棒?)什么的。

然后mv /tmp挂载指向另一个名称,将新文件系统挂载到/tmp,然后在分区上运行mke2fs 曾经是/tmp,并从头开始编写一个全新的干净文件系统。

重新创建旧tmp设备后,您可以再次执行这些步骤 - mv /tmp /new-tmp,复制应该持久的数据,mount重新格式化的设备重新开始/tmp, 1}},并复制应该保留的数据。

答案 3 :(得分:0)

当我想清理一个画廊的上传目录时,我做了这种事情。这真的很长......所以我决定尝试使用命令exec()rm /path/to/clean/*命令,但速度非常快。

不是很干净,但至少,它对我有用。

答案 4 :(得分:0)

是否需要使用php脚本进行清理?

如果没有,请查看此article ...应该为您提供一些想法

答案 5 :(得分:0)

这可能是删除/ tmp:

下所有文件的更快的标准方法
find /tmp -type f -exec rm {} +

Gnu发现,这可能会稍快一些:

find /tmp -type f -delete

如果/ tmp在自己的文件系统上,只需卸载并mkfs即可。如果是tmpfs,只需重启。