在 Ubuntu 14.04 上删除过期的 PHP 会话文件

在 Ubuntu 14.04 上删除过期的 PHP 会话文件

一切都从 MySQL 无法启动开始。

经过一些网络搜索后,我发现服务器的 inode 用完了。

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/simfs     500000 500000      0  100% /
none           131072     56 131016    1% /dev
none           131072      1 131071    1% /sys/fs/cgroup
none           131072     63 131009    1% /run
none           131072      4 131068    1% /run/lock
none           131072      1 131071    1% /run/shm
none           131072      1 131071    1% /run/user

进一步的谷歌搜索使我假设 PHP 会话文件永远不会被删除......这似乎是正确的,因为运行ls php5 | wc -l给了我424669

我读到 PHP.ini session.gc_probability 默认设置为 0,并且 ubuntu 通过 cronjob 处理清理/etc/cron.d/php5.

/etc/cron.d/php5

# /etc/cron.d/php5: crontab fragment for php5
#  This purges session files older than X, where X is defined in seconds
#  as the largest value of session.gc_maxlifetime from all your php.ini
#  files, or 24 minutes if not defined.  See /usr/lib/php5/maxlifetime

#Look for and purge old sessions every 30 minutes
09,39 *     * * *     root   [ -x /usr/lib/php5/maxlifetime ] && [ -x /usr/lib/php5/sessionclean ] && [ -d /var/lib/php5 ] && /usr/lib/php5/sessionclean /var/lib/php5 $(/usr/lib/php5/maxlifetime)

这看起来是对的,那么为什么这个脚本不起作用?有没有办法确认它确实每 30 分钟运行一次?

答案1

PHP 会话文件永远不会被删除

您没有说明您使用的是哪种会话处理程序 - 假设它是默认的,则每当触发会话垃圾收集时,过期的会话都应被清除。您的 session.cache_expire 太高和/或 session.gc_probability 太低,和/或 session.gc_divisor 太高。

session.gc_probability 默认设置为 0

不可以 - 只适用于 Debian 系统(Ubuntu 源自 Debian)。Debian 上的某个人认为有奇怪的权限会话存储可以防止会话劫持。实际上它只处理非常可能的攻击的狭窄子集——当你采取适当的措施来处理更可能的攻击媒介时,问题就会消失。

这样做的结果是,如果您想以 Debian 预先确定的方式以外的任何方式管理您的 PHP 会话,您需要 root 访问权限。

我主要喜欢 Debian - 但这总让我觉得很傻。

答案2

由于您以 Root 身份运行它,因此您可以使用 Logger 命令写入 syslog。

&& logger -t PHP_SESSIONS “PHP 会话已清除”

然后 ”cat /var/log/syslog | grep PHP_SESSIONS“稍后查看其运行的时间。

当然,这只是告诉您 cron 作业已运行,而不是告诉您它是否成功。

相关内容