无法删除 php 会话

无法删除 php 会话

我已阅读了数十篇有关该主题的帖子,但仍找不到适合我的解决方案。

我有一个用户帐户。该帐户的 PHP 会话存储在

/home/user/tmp

Apache 开始抛出错误,由于设备已满,我无法打开会话。

df 和 df -i 都显示设备有足够的空间。

于是我查看了 /home/user/tmp 目录。它显示目录的大小为 901MB。

我想从目录中删除会话文件。

我努力了

rm -rf /home/user/tmp/sess_*

我让它运行了一个多小时,然后用来cntr+C终止命令。目录仍然显示 901 MB。

我已经重新启动系统,但目录仍然显示为 901MB。

我努力了

find /home/*/tmp -type f -name 'sess_*' -ctime +5 -delete

就像rm -rf我让命令运行一个多小时然后将其终止一样。

该目录仍然显示901MB。

我以 root 用户身份发出这些命令。我使用的是 ubuntu 16.04。这是一个服务器,因此只有命令行选项有效。

我该怎么做才能删除这些会话文件?

答案1

通常,即使使用类似命令,你也无法删除会话文件,sudo rm -rf /var/lib/php/sessions/*因为路径名扩展发生在 sudo 之前(https://serverfault.com/a/851261/591003)。

您可以尝试另一个命令,sudo sh -c "rm -rf /var/lib/php/sessions/*"但如果您有大量文件,您会得到一个答案,rm: Argument list too long因为会话文件列表通常非常庞大(多达数百万个文件)。

我建议一个非常简单的方法:

  1. 新建一个文件夹会话_新mkdir /var/lib/php/sessions_new
  2. 设置与旧版本相同的权限会议目录:sudo chmod --reference=sessions sessions_new
  3. 对所有权也采取同样的做法:sudo chown --reference=sessions sessions_new
  4. 杀了它!sudo rm -rf /var/lib/php/sessions
  5. 你不需要等待很长时间才能得到结果。你可以立即在新的终端窗口中通过 来查看结果sudo find /var/lib/php/sessions/. -type f|wc -l。此命令会统计你的会议文件夹。运行两次。如果第二次运行该命令时得到的数字低于第一次,则表示进程正在朝着正确的方向进行。
  6. 等了好久了:P
  7. 当过程完成后只需重命名会话新目录:mv /var/lib/php/sessions_new /var/lib/php/sessions

答案2

如果有很多小文件,删除可能需要相当长的时间。让它运行直到完成。它最终应该会完成。

我在我的系统上做了一个快速测试,删除使用 ext4 的 SSD 磁盘上的 10 万个空文件需要 1.14 秒。如果你有数千万个文件,可能需要一段时间。

答案3

我认为Dzmitry Kulahin 的 解决方案可以,但就我而言,空间不足,因此无法创建新的“sessions_new”目录。我使用命令行 php 在交互模式下解决了这个问题:

sudo php -a

请注意必须使用sudo,否则后续命令没有操作权限。

将此序列写在一行上,有必要将其写在一行上,因为在交互模式下,每次按下回车键都会立即执行该命令:

$listfile = scandir("/var/lib/php/sessions/");
foreach ($listfile as $file) {
    if (!is_dir("/var/lib/php/sessions/".$file)) {
        unlink("/var/lib/php/sessions/".$file);
    }
}

按下该enter键,文件开始删除。

您可以通过打开另一个终端并输入以下内容来监控取消情况:

sudo find /var/lib/php/sessions/. -type f|wc -l

它将显示目录中的文件数量,重复此命令几次,您将看到随着文件被删除,文件数量会减少。

相关内容