SessionHandler::gc(): ps_files_cleanup_dir |权限被拒绝 (13)

Posted

技术标签:

【中文标题】SessionHandler::gc(): ps_files_cleanup_dir |权限被拒绝 (13)【英文标题】:SessionHandler::gc(): ps_files_cleanup_dir | Permission denied (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" 可能意味着您应该尝试允许此目录中的删除操作 【参考方案1】:

背景

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

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

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

可能的原因

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

解决方案

    在验证您的安装使用 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 进行会话清理。

    防止 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
    

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

    (潜在危险)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 脚本都可以列出和访问所有活动会话。

以上是关于SessionHandler::gc(): ps_files_cleanup_dir |权限被拒绝 (13)的主要内容,如果未能解决你的问题,请参考以下文章

-bash:__git_ps1:找不到命令

(Mac) -bash: __git_ps1: 找不到命令

AVX512 缺少内在的 _mm512_round_ps

_mm_shuffle_ps() 等价于整数向量 (__m128i)?

画笔的样式

如何将两个_pd 转换为一个_ps?