PHP 会话目录不断填充直至溢出

PHP 会话目录不断填充直至溢出

我的 PHP 会话数据文件夹有问题。它似乎没有过期会话,并且达到了某种限制,可能是文件系统对目录中文件的限制。由于磁盘空间不足,涉及写入会话的请求会失败并出现致命错误。

sessions.save_path我通过指向一个新目录暂时解决了这个问题。

想知道我的错误是什么php.ini,导致会话过期。

我也尝试sessions使用截断目录rm但它似乎永远挂起了?

问题目录:

drwxr-xr-x  2 www-data www-data 294215680 Jan  5 13:42 sessions

会议部分php.ini

[Session]
session.save_handler = files
session.save_path = "N;/var/www/data/sessions"
session.use_strict_mode = 0
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 2592000
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php
session.gc_probability = 0
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.referer_check =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.hash_function = 0
session.hash_bits_per_character = 5

答案1

session.save_path = "N;/var/www/data/sessions"

这似乎并没有造成问题(因为 PHP 显然正在生成会话),但这并不正确。

此选项有两种格式:

/path/to/sessions
N;/path/to/sessions

整数 N定义在指定路径下创建多少个子目录,如果您需要大量会话文件,则可用于将会话文件分散到许多目录中。(您已经发现系统不喜欢一个目录中有大量文件......)

session.gc_probability = 0

这很可能是主要问题(除非 PHP 自动处理有人错误地将其设置为 0)

清理发生的概率由定义probability/divisor0/1000为 0,因此可能永远不会运行。

编辑:关于删除文件,您可能只需要等待它完成。如果有数百万个文件,它可能看起来像是挂了。

答案2

您需要一个 cron 作业来清理会话文件,它们不会自行清理。Ubuntu/Debian 有一个脚本 ( /etc/cron.d/php) 可以自动执行清理。

如果您没有这样的脚本,请放find /var/www/data/sessions -cmin +1440 -print0 | xargs -0 -r rm一个 cronjob。

它将清理 24 小时或更长时间的文件。

答案3

您的配置包括以下设置:

session.save_path = "N;/var/www/data/sessions"

这似乎不正确。领先的N在里面session.save_path应该是整数定义用于分发会话文件的子目录级别的数量。

根据手册,使用“N”(正确或不正确)也会阻止垃圾收集,并且您需要一个 cron 作业来删除旧的会话文件:

此指令有一个可选的 N 参数,用于确定会话文件将分布在的目录级别数。例如,设置为"5;/tmp"可能最终会创建一个会话文件和位置,如/tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174。为了使用 您必须在使用前创建所有这些目录。ext/session 中有一个小型 shell 脚本可以执行此操作,它称为 mod_files.sh,Windows 版本称为 mod_files.bat。另请注意如果N使用并且大于 0,则不会执行自动垃圾收集,请参阅 php.ini 的副本以获取更多信息。另外,如果您使用 N,请务必将 session.save_path 括在“引号”中,因为分隔符 (;) 也用于 php.ini 中的注释。

相关内容