我的 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/divisor
。0/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 中的注释。