我在 CentoOS (WHM/CPANEL) 和 Prestashop 1.7 中遇到 PHP7 问题
系统给我这个消息:
Notice on line 429 in file /home/onywf3fr9a/public_html/app/cache/dev/classes.php
[8] SessionHandler::gc(): ps_files_cleanup_dir: opendir(/var/cpanel/php/sessions/ea-php70) 失败:权限被拒绝 (13)
原文由 user3250372 发布,翻译遵循 CC BY-SA 4.0 许可协议
背景
当 PHP 尝试垃圾收集过期会话时会发生此错误,但包含会话文件的目录不可列出(缺少
r
访问位)用户 PHP 运行为。这通常是针对 PHP 会话劫持的安全措施。 例如,Debian 将会话目录的权限设置为
drwx-wx-wt
。这些权限允许任何人创建会话,创建会话的用户如果知道文件名(会话 ID)可以再次读取它,但只有 root 才能获得所有活动会话的 _列表_。具有此配置的发行版通常还会设置一个 cronjob 或计时器,定期清理会话并禁用 php.ini 中的本机垃圾收集:
session.gc_probability = 0
。可能的原因
php.ini
并将 --- 更改为 ---0
session.gc_probability
以外的值。ini_set()
session.gc_probability
。一些 PHP 框架容易出现这种情况。例如 ,Symfony 总是将session.gc_probability
设置为1
如果没有另外配置的话。解决方案
将 php.ini 中的 — 更改为
session.gc_probability
0
在验证您的安装使用 cronjob/timer 进行会话清理之后。/usr/local/cpanel/scripts/clean_user_php_sessions
删除过期会话,因此所有 CPanel 安装都使用 cronjob。phpsessionclean.timer
进行会话清理。防止 Web 应用程序覆盖
session.gc_probability
。对于基于 Symfony 的应用程序,这可以通过修改config/packages/framework.yaml
来完成:安全通知:更改权限允许 任何 PHP 脚本枚举所有活动会话 ID 并可能访问所有会话。仅当您确定上述解决方案不适用时才这样做!
session.save_path
更改为/tmp
或 PHP 可以访问以进行读写的类似目录。安全通知:将会话保存路径更改为世界可读目录允许 任何 程序和任何 PHP 脚本枚举所有活动会话 ID 并可能访问所有会话。仅当您确定上述解决方案不适用时才这样做!