SessionHandler :: gc():ps_files_cleanup_dir | 许可被拒绝(13)

use*_*372 3 php centos prestashop prestashop-1.7

我在CentoOS(WHM/CPANEL)和Prestashop 1.7中遇到PHP7问题

系统给了我这个消息:

Notice on line 429 in file /home/onywf3fr9a/public_html/app/cache/dev/classes.php
Run Code Online (Sandbox Code Playgroud)

[8] SessionHandler :: gc():ps_files_cleanup_dir:opendir(/ var/cpanel/php/sessions/ea-php70)失败:权限被拒绝(13)

cg9*_*909 23

背景

r当 PHP 尝试对过期会话进行垃圾收集,但PHP 运行用户无法列出包含会话文件的目录(缺少访问位)时,会发生此错误。

这通常是针对 PHP 会话劫持的安全措施。例如,Debian 将会话目录的权限设置为drwx-wx-wt. 这些权限允许任何人创建会话,并且创建会话的用户如果知道文件名(会话 ID),则可以再次读取它,但只有 root 可以获取所有活动会话的列表。

具有此配置的发行版通常还会设置一个 cronjob 或计时器来定期清理会话并禁用 php.ini: 中的本机垃圾收集session.gc_probability = 0

可能的原因

  1. 您或其他人修改了php.ini并更改session.gc_probability为 以外的值0
  2. PHP 脚本用于在运行时ini_set()进行修改session.gc_probability。一些 PHP 框架很容易出现这种情况。例如,如果没有另外配置,Symfony 总是设置session.gc_probability1
  3. 您或管理服务器的其他人在不使用 cronjob 或计时器来清理过期会话的系统上搞砸了会话目录权限。

解决方案

  1. 在验证您的安装使用 cronjob/计时器进行会话清理后,将 php.ini更改session.gc_probability为。0

    • CPanel 用于/usr/local/cpanel/scripts/clean_user_php_sessions删除过期会话,因此所有 CPanel 安装都使用 cronjob。
    • Debian、Ubuntu 和 Linux Mint 使用 systemd 计时器phpsessionclean.timer进行会话清理。
  2. 防止 Web 应用程序覆盖session.gc_probability. 对于基于 Symfony 的应用程序,这可以通过修改来完成config/packages/framework.yaml

    framework:
        session:
            gc_probability: null
    
    Run Code Online (Sandbox Code Playgroud)
  3. 如果您的系统确实使用本机会话垃圾收集而不是 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
    
    Run Code Online (Sandbox Code Playgroud)

    安全通知:更改权限允许任何PHP 脚本枚举所有活动会话 ID 并可能访问所有会话。仅当您确定上述解决方案不适用时才执行此操作!

  4. (潜在危险)更改session.save_path/tmpPHP 可以访问并进行读写的类似目录。

    安全通知:将会话保存路径更改为世界可读的目录允许任何程序和任何 PHP 脚本枚举所有活动会话 ID 并可能访问所有会话。仅当您确定上述解决方案不适用时才执行此操作!


小智 8

我有同样的问题,我改变了 session.save_pathphp.ini中 到我的php.ini中的"/ tmp"


Wil*_*ier 5

我清除了缓存,问题已解决:)


小智 3

用于固定

\n\n

\xc2\xabNotice: SessionHandler::gc(): ps_files_cleanup_dir: opendir("/var/cpanel/php/sessions/ea-php70") failed: Permission denied"

\n\n

我建议将此特定文件夹 (/var/cpanel/php/sessions/ea-php70) 的写入访问权限授予您用于 PHP 解释器的操作系统帐户。

\n\n

使用 session.gc_probability=0 PHP 设置禁用 PHP 的会话垃圾收集器并不是一个好的解决方案,因为会话文件夹中会有很多孤立的会话文件,这会浪费磁盘空间并减慢您的速度。服务器。

\n

  • @SteveB 好吧,debian 和 ubuntu 软件包带有禁用的内置 GC 以及通过 cron 或 systemd 运行的外部清理脚本。只需安装它并自行检查即可。 (2认同)