Symfony 3.1.5 警告:SessionHandler::read():会话数据文件不是由您的 uid 创建的

Posted

技术标签:

【中文标题】Symfony 3.1.5 警告:SessionHandler::read():会话数据文件不是由您的 uid 创建的【英文标题】:Symfony 3.1.5 Warning: SessionHandler::read(): Session data file is not created by your uid 【发布时间】:2017-02-20 04:01:20 【问题描述】:

我在由 Vagrant 1.8.6/VirtualBox 5.1.6 管理的 Ubuntu 14.04、php 7.1 和 Apache 2.4.23 堆栈上运行 Symfony 3.1.5。我正在尝试使用我制作的简单控制器在前端呈现响应:

<?php

namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\BrowserKit\Response;

class LandingController 
    /**
     * @Route("/", name="homepage")
     */
    public function showAction()
        return new Response('This is the landing page!');
    

当我尝试通过/app_dev.php 访问我的 Symfony 前端时,我看到了:

Warning: SessionHandler::read(): Session data file is not created by your uid 500 Internal Server Error - ContextErrorException

我的 Apache 日志显示:

CRITICAL - Uncaught PHP Exception Symfony\Component\Debug\Exception\ContextErrorException: "Warning: SessionHandler::read(): Session data file is not created by your uid" at /var/www/conan/var/cache/dev/classes.php line 366

Symfony 开发日志如下:

==> /var/www/conan/var/logs/dev.log <== [2016-10-11 14:23:04] request.INFO: Matched route "route". "route":"homepage","route_parameters":"_controller":"AppBundle\\Controller\\LandingController::showAction","_route":"homepage","request_uri":"http://conan.dev/app_dev.php/","method":"GET" [] [2016-10-11 14:23:04] request.CRITICAL: Uncaught PHP Exception Symfony\Component\Debug\Exception\ContextErrorException: "Warning: SessionHandler::read(): Session data file is not created by your uid" at /var/www/conan/var/cache/dev/classes.php line 366 "exception":"[object] (Symfony\\Component\\Debug\\Exception\\ContextErrorException(code: 0): Warning: SessionHandler::read(): Session data file is not created by your uid at /var/www/conan/var/cache/dev/classes.php:366)" []

鉴于这似乎是与会话相关的问题,我参考了 Session Management 的 Symfony 文档。它指出:

Symfony 会话与 php.ini 指令 session.auto_start = 1 不兼容 该指令应在 php.ini、webserver 指令或 .htaccess 中关闭。

session.auto_start = 0 在我的php.ini 中,该文件归用户和组root 所有:

$ ls -lta /etc/php/7.1/fpm/php.ini -rw-r--r-- 1 root root 70584 Sep 30 07:29 /etc/php/7.1/fpm/php.ini

我已尝试按照 Symfony 文档中的说明创建一个 .htaccess(我将其放在我的 DocumentRoot 中),但错误仍然存​​在。

我已经搜索了几个主题和问题以寻找解决方案,但没有找到任何解决方案。任何想法是什么原因造成的?

【问题讨论】:

【参考方案1】:

就我而言,我使用的是 sysfony 2,在删除缓存后问题就消失了。

rm -rf /app/cache/*

【讨论】:

【参考方案2】:

如果您对同步文件夹使用 NFS,则其中所有文件的 UID 和 GID 将是运行 Vagrant 的 host 用户的 UID 和 GID,并且可能与 UID 和来宾上vagrant 用户的 GID。例如,我有:

-rw-r--r--  1  501 dialout 5.1K Oct 29 15:14 Vagrantfile

501是我的用户在Mac上的UID,guest上没有对应的用户。 dialout 是来宾上与 staff 组匹配的组,这是我在 Mac 上的主要组。

虽然您有权读取和写入同步文件夹中的所有文件,但当 PHP 检查会话文件所有者的 UID 时,它与运行 PHP 的用户不匹配,并且它会阻止访问作为安全措施.

您可以使用vagrant-bindfs 插件解决此问题:

vagrant-bindfs

一个用于在 VM 中自动挂载 bindfs 的 Vagrant 插件。这允许您更改文件的所有者、组和权限,例如,解决 NFS 共享权限问题。

这对我有用:

运行vagrant plugin install vagrant-bindfs

在你的 Vagrantfile 中:

config.vm.synced_folder '.', '/vagrant', disabled: true
config.vm.synced_folder '.', '/vagrant-nfs', type: 'nfs'

config.bindfs.bind_folder '/vagrant-nfs', '/vagrant'

运行vagrant reload

它有效:

-rw-r--r--  1 vagrant vagrant 5.1K Oct 29 15:45 Vagrantfile

【讨论】:

【参考方案3】:

我正在使用基于 symfony 3 的 PIMCORE。 为了解决这个问题,我刚刚清除了浏览器缓存。

我希望这会有所帮助。

【讨论】:

【参考方案4】:

就我而言,*删除浏览器 cookie 解决了这个问题。我没有执行上面提到的任何步骤并尝试更改权限,但没有这不是问题。我在 magento 上遇到了问题。

【讨论】:

在 Chrome 隐身模式下工作,因为不保留 cookie【参考方案5】:

无法写入会话路径,因为网络用户和会话文件夹中内容的所有者不同,因此不会。

解决方案是将您的 /var 或 /var/sessions/ 所有权设置给网络用户。

chown apache:apache /var/ -R * 要么: chown www-data:www-data /var/ -R *

评分最高的反应并不是最好的反应。

【讨论】:

【参考方案6】:

避免因仅在开发环境中出现的问题而更改 prod 配置

将 Vagrant (PHP-FPM 7 + nginx) 与同步文件夹 (/vagrant ~ 默认) 一起使用时遇到同样的问题

解决了就放

    session:
        save_path: '/tmp'

关于 config_dev.ymlframework 条目

只需选择Webserver和PHP可以在没有权限问题的情况下读取/写入的地方。

【讨论】:

就是这样,我们在 Vagrant (PHP 7.1 + nginx 10) 中有相同的设置,这解决了问题。 您不能使用 /tmp 来存储会话,需要更好的安全性,因为任何人都可以访问 /tmp 并且可以删除会话文件。【参考方案7】:

如果 Magento 2 生成此警告,

只需删除 var/session 文件夹中已经存在的会话及其固定

【讨论】:

【参考方案8】:

我遇到了类似的问题,清除浏览器的缓存和存储的数据解决了这个问题。

在 chrome 和 opera 上,您应该执行以下操作:

Developer tools > Application > Clear Storage > Clear Site Data

【讨论】:

【参考方案9】:

我遇到了同样的问题。对我有用的解决方法是将var/sessions 所有者更改为www-data:www-data(php-fpm 子进程的用户/组相同):

sudo chown -R www-data:www-data var/sessions/

【讨论】:

就我而言,“不允许操作”。我猜主要是因为与 Vagrant 的同步文件夹。【参考方案10】:

编辑 config/config.yml 并将 save_path: "%kernel.root_dir%/../var/sessions/%kernel.environment%" 替换为 save_path: /var/lib/php/sessions 修复了错误。

如果您使用自动将空格转换为制表符的编辑器/IDE,请务必在保存更改之前禁用该功能。不这样做可能会导致发生“不包含有效的 YAML”错误。

【讨论】:

我在我的项目中使用 Vagrant,这就是我今天早上必须做的事情。团队的其他成员正在 MAC 上使用 MAMP,他们不必进行更改。我想知道为什么它可以在开发服务器和现场运行。 我也在使用 Vagrant,我最终关注了这个帖子 ***.com/questions/13169154/…。问题似乎是 synced_folder 设置的权限。无需对 config.yml 进行此更改。希望它可以帮助某人。 另一种可能的解决方案是删除 /var/session/[environment] 中的当前会话文件。根据您设置和运行服务器的方式以及您的 Linux 用户设置,这些文件可能由不同的用户拥有。 我正在使用 Docker,我必须手动创建 /var/lib/php 才能完成这项工作,所以我认为 symfony 项目文件夹中的 ./var/session 更可取 有效,但配置不应该转到 config/config_dev.yml 以避免意外接触您的生产环境吗?【参考方案11】:

您使用了错误的响应命名空间。

你有use Symfony\Component\BrowserKit\Response;,应该是use Symfony\Component\HttpFoundation\Response;

【讨论】:

以上是关于Symfony 3.1.5 警告:SessionHandler::read():会话数据文件不是由您的 uid 创建的的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 pyspark EMR Notebook 上的错误 - AnalysisException:无法实例化 org.apache.hadoop.hive.ql.metadata.SessionH

用户测试中多个客户端的 Symfony 4.4 弃用警告已弃用,但仍存在于文档中

在 Symfony 2(.7) 中禁用已弃用的警告

Symfony 警告:DOMElement::setAttribute(): string is not in UTF-8

警告:非法字符串偏移量'city'Symfony表单搜索

Symfony 3,ArrayCollection的remove()导致错误“警告:isset中的非法偏移类型或为空”