Symfony2 会话和缓存:清除命令

Posted

技术标签:

【中文标题】Symfony2 会话和缓存:清除命令【英文标题】:Symfony2 session and cache:clear command 【发布时间】:2015-09-27 12:12:35 【问题描述】:

我使用 Symfony 会话来存储和检索用户在启动页面上选择的语言。如果他们没有设置语言,他们将直接重定向到启动画面。此行为按预期工作。

不幸的是,当我清除缓存时遇到了问题(我使用php app/console cache:clear --env=prod 命令)。用户可以访问一个页面,然后在任何单击时将他们重定向到启动画面。之后,即使他们选择了一种语言,他们也无法进入首页,任何点击都会再次重定向到启动页面。

如果我手动删除缓存文件夹,则不会发生错误。

我的会话相关配置如下:

framework:
    session:
        handler_id:  ~
        gc_probability: 0

我的缓存目录中没有会话文件夹。 我可以在我的站点 tmp 文件夹中找到我的会话文件(会话 ID 和内容与用户会话 cookie 和语言选择相匹配)。它们在 cache:clear 命令后被保留,但似乎 Symfony 无法再从这些文件中获取值。此外,没有为这些用户创建新的会话文件,而且似乎无法在任何地方编写新的语言选择。

我的本​​地开发环境(改进的 Homestead)没有错误,但我所有其他环境(开发、登台、生产)都有错误

使用 $session->invalidate();在启动页面上将解决问题。但我想了解它为什么会发生。有什么想法吗?

【问题讨论】:

为什么将 gc_probability 设置为 0 ?我想你会覆盖 session.save_path 吗?如果您在配置未更改的环境检查之间有不同的行为 老实说,我不知道 gc_probability 因为我自己没有开始这个项目。将删除该设置以使用默认设置。 session.save_path 在 Symfony 配置和任何捆绑软件中都不会被覆盖。因此,这应该默认为%kernel.cache.dir%/sessions,但这不是发生的情况,它们存储在 tmp 文件夹中。 php session.save_path 的值设置为/srv/www/my_domain/var/tmp,它是写入会话文件的位置。 【参考方案1】:

您是否处于多服务器环境中?如果是这样,我建议将会话存储在数据库中:http://symfony.com/doc/current/cookbook/configuration/pdo_session_storage.html

【讨论】:

不,这是单服务器环境。【参考方案2】:

您可以更改 Symfony 保存会话数据的目录,以便在清除缓存时会话保持活动状态。您只需更改框架配置即可执行此操作。 例如:

#config.yml
framework:
    session:
        save_path: "%kernel.root_dir%/sessions"

doc中的进一步参考

希望有帮助

【讨论】:

会话文件似乎存储在/srv/www/my_domain/var/tmp 所以在缓存文件夹之外。我在整个缓存目录中看不到任何相关的会话文件。 Symfony 中的 session.save_path 会覆盖 php.ini 的值吗? 仅适用于 Symfony3。问题是关于 Symfony2(哪些会话在 app/cache//sessions)

以上是关于Symfony2 会话和缓存:清除命令的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2禁用缓存?

如何创建将在 Symfony2 中过期/销毁会话的命令控制台?

清除产品缓存。环境。在 Orocommerce

如何正确地使 Symfony2 应用程序的生产缓存无效?

ssl缓存是啥

Symfony2 监听器和会话