我在 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)
当 PHP 尝试垃圾收集过期会话时会发生此错误,但包含会话文件的目录对于用户 PHP 运行为不可列出(缺少
r
访问位)。
这通常是针对 PHP 会话劫持的安全措施。 例如Debian 将会话目录的权限设置为
drwx-wx-wt
。这些权限允许任何人创建会话,如果创建会话的用户知道文件名(会话 ID),他们可以再次阅读它,但只有 root 才能获得所有活动会话的list。
具有此配置的发行版通常还会设置一个 cronjob 或计时器,定期清理会话并禁用 php.ini 中的本机垃圾收集:
session.gc_probability = 0
.
php.ini
并将session.gc_probability
更改为0
以外的值。ini_set()
在运行时修改 session.gc_probability
。一些 PHP 框架容易出现这种情况。例如。 Symfony 总是将 session.gc_probability
设置为 1
如果没有另外配置.在验证您的安装使用 cronjob/timer 进行会话清理后,将 php.ini 中的
session.gc_probability
更改为 0
。
/usr/local/cpanel/scripts/clean_user_php_sessions
删除过期会话,因此所有 CPanel 安装都使用 cronjob。phpsessionclean.timer
进行会话清理。防止 Web 应用程序覆盖
session.gc_probability
。对于基于 Symfony 的应用程序,这可以通过修改 config/packages/framework.yaml
: 来完成
framework:
session:
gc_probability: null
如果您的系统真的使用本机会话垃圾收集而不是 cronjob 或计时器,请更改会话文件夹的权限以允许列出运行 PHP 的用户:
# Check beforehand which group php-fpm runs as. Here I assume www-data:
chgrp www-data /var/cpanel/php/sessions/ea-php70
chmod g+r /var/cpanel/php/sessions/ea-php70
安全通知:更改权限允许 any PHP 脚本枚举所有活动会话 ID 并可能访问所有会话。仅当您确定上述解决方案不适用时才这样做!
session.save_path
更改为 /tmp
或 PHP 可以访问以进行读写的类似目录。
安全通知:将会话保存路径更改为世界可读目录允许 any 程序和任何 PHP 脚本枚举所有活动会话 ID 并可能访问所有会话。仅当您确定上述解决方案不适用时才这样做!
我清除了缓存,问题已经解决了:)
用于固定
«Notice: SessionHandler::gc(): ps_files_cleanup_dir: opendir("/var/cpanel/php/sessions/ea-php70") failed: Permission denied"
我建议将此特定文件夹 (/var/cpanel/php/sessions/ea-php70) 的写访问权限授予您用于 PHP 解释器的操作系统帐户。
使用 session.gc_probability=0 PHP 设置禁用 PHP 的会话垃圾收集器不是一个好的解决方案,因为会话文件夹中会有很多孤立的会话文件,这会浪费磁盘空间并降低服务器速度。
出现此错误是因为您需要文件夹权限才能将您的会话文件存储在会话文件夹中。
这个错误对于所有流行的框架都很常见。解决方法是 1. 授予会话文件夹权限,如显示存储文件或 2. 在您的项目中创建一个本地会话文件夹,并重写您项目中的会话文件存储路径。
虽然这不是很优雅,但我找到了一个至少对我有用的解决方案。我注意到,如果我稍等片刻并刷新页面,我就明白了。我在测试和快速来回页面时遇到此错误。
$count = 0;
do {
if (@session_start()) {
break;
}
sleep(1);
$count++;
} while ($count < 4);
虽然这会造成轻微的延迟,并且不会造成无限循环,但它似乎让服务器赶上了事情。