【问题标题】:SessionHandler::gc(): ps_files_cleanup_dir | Permission denied (13)SessionHandler::gc(): ps_files_cleanup_dir |权限被拒绝 (13)
【发布时间】:2018-04-13 02:11:38
【问题描述】:

我在 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)

【问题讨论】:

  • 您是否尝试过使该目录可写?
  • 在 FileZilla 中检查您的目录权限
  • "ps_files_cleanup_dir" 可能意味着您应该尝试允许此目录中的删除操作

标签: php centos prestashop prestashop-1.7


【解决方案1】:

背景

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

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

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

可能的原因

  1. 您或其他人修改了php.ini 并将session.gc_probability 更改为0 以外的值。
  2. PHP 脚本在运行时使用ini_set() 修改session.gc_probability。一些 PHP 框架容易出现这种情况。例如。 Symfony always sets session.gc_probability to 1 if not configured otherwise
  3. 您或管理服务器的其他人在不使用 cronjob 或计时器清理过期会话的系统上搞砸了会话目录权限。

解决方案

  1. 在验证您的安装使用 cronjob/timer 进行会话清理后,将 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
    
  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
    

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

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

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

【讨论】:

    【解决方案2】:

    用于修复

    «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 的会话垃圾收集器不是一个好的解决方案,因为会话文件夹中会有很多孤立的会话文件,它会浪费磁盘空间并减慢您的速度服务器。

    【讨论】:

    • “因为你会在会话文件夹中有很多孤立的会话文件” --- debian php 包不是带有一个专门的 cron 作业来独立于 php 清理会话吗?
    • @zerkms 不,它没有。 php 在脚本执行期间根据 php.init / 中设置的信息运行它的会话垃圾收集器。但是您应该始终为每个项目会话设置专用目录,因为它们的生命周期设置可能不同,如果目录是共享的,则会导致会话提前到期
    • @SteveB 好吧,debian 和 ubuntu 软件包禁用了内置 GC,并带有通过 cron 或 systemd 运行的外部清理脚本。只需安装它并检查自己。
    • @zerkms 好吧,你找到我了。链接有关 serverfault 的相关问题以供参考:serverfault.com/questions/511609/….
    • @Dmitriy Buteiko,当我以 root 身份授予权限时,它可以工作,但第二天我又遇到了同样的异常!!!我应该怎么做才能使它永久化?我总是运行这两个命令:1- sudo chown username: -R /var/cpanel/php/sessions/ea-php70 ## 2- sudo chmod u+w -R /var/cpanel/php/sessions/ea-php70
    【解决方案3】:

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

    【讨论】:

    • 我有同样的错误,在php.ini中将路径文件更改为/tmp并清除了缓存,但仍然显示相同的错误。
    【解决方案4】:

    出现此错误,因为您需要文件夹权限才能将会话文件存储在会话文件夹中。

    此错误在所有流行的框架中都很常见。解决方案是 1. 授予会话文件夹权限,以显示存储文件或 2.在你的项目中创建一个本地会话文件夹,并重写你项目中的会话文件存储路径。

    【讨论】:

      【解决方案5】:

      我有同样的问题,我在我的 php.ini 中将 session.save_path 更改为“/tmp”

      【讨论】:

      • 将会话文件夹更改为“tmp”而不是“var/cpanel/php/sessions/ea-php73”目录是否存在安全问题?
      • 更改为“/tmp”之前的值是多少?
      • @Kat 是的,有一个问题:任何用户 (rwt) 都可以列出 /tmp。这意味着服务器上的每个程序都可以枚举所有活动会话 id,每个 PHP 脚本都可以列出和访问所有活动会话。
      猜你喜欢
      • 2015-05-24
      • 2014-03-24
      • 2017-11-03
      • 1970-01-01
      • 1970-01-01
      • 2014-08-10
      • 2018-07-19
      • 2017-04-20
      • 2011-06-11
      相关资源
      最近更新 更多