Symfony2 配置数据库存储 session

标签 symfony

更新:问题已解决,请参阅评论(很多问题,版本差异只是其中之一)。

我正在尝试在 config.yml 文件中配置 Symfony2 中的 session 。我有以下配置:

session:
    default_locale: %locale%
    lifetime:       7200
    auto_start:     true
    storage_id:     session.storage.pdo

parameters:
  pdo.db_options:
    db_table:    session
    db_id_col:   session_id
    db_data_col: session_value
    db_time_col: session_time

services:
  pdo:
    class: PDO
    arguments:
      - "mysql:dbname=%database_name%"
      - %database_user%
      - %database_password%

session.storage.pdo:
  class:     Symfony\Component\HttpFoundation\SessionStorage\PdoSessionStorage
  arguments: [@pdo, %session.storage.options%, %pdo.db_options%]

它基于 Symfony2 的食谱 http://symfony.com/doc/2.0/cookbook/configuration/pdo_session_storage.html

我创建了与给定链接中完全相同的表。

但是,它不起作用。我收到一些“空白”错误(没有错误消息,但有“PDO 异常”和“错误异常”)。我承认我对配置 Symfony2 或任何信息没有太多知识(这就是我使用食谱的原因)。我浪费了很多时间,在互联网上没有看到太多关于它的文档,更不用说互联网对这种情况相当沉默了(将 session 存储到 Symfony2 中的数据库表中)。

我的 NetBeans 正在“大喊”最后一行:

  arguments: [@pdo, %session.storage.options%, %pdo.db_options%]

“扫描下一个标记时出现 ScannerException,我们发现无法启动任何标记的字符 @(64)”。

更新: 嗯,现在我不确定是否与配置有关。我可以看到 Symfony2 的食谱(使用...)示例实际上与 Symfony2 包中的文件结构不匹配。一句话,没有这个文件路径,但是放到真实的文件路径后还是不行。

最佳答案

我在 Symfony 2.5 中遇到了和你一样的问题。事实证明我的解决方案是在 php.ini 中禁用 session.auto_start 。如果在 PDO 有机会控制 session 之前启动 session ,PdoSessionStorage 将不会接管。我一开始忽略了这一点,因为我修改了错误的内容(我有两份 php.ini 副本)。要检查这是否是您的问题,请运行以下命令:

echo ini_get('session.auto_start');

如果返回“1”或“true”,请务必在 php.ini 中进行设置:

session.auto_start = 0

作为引用,这是我使用 Symfony 2.5 进行的设置:

config.yml

framework:
    session:
        handler_id: session.handler.pdo

parameters:
    pdo.db_options:
        db_table:    session
        db_id_col:   session_id
        db_data_col: session_value
        db_time_col: session_time

services:
    session.handler.pdo:
        class:     Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler
        arguments: ["@pdo", "%pdo.db_options%"]
    pdo:
        class: PDO
        arguments:
            dsn: "mysql:host=%database_host%;port=%database_port%;dbname=%database_name%"
            user: "%database_user%"
            password: "%database_password%"
        calls:
            - [setAttribute, [3, 2]] # \PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION

关于Symfony2 配置数据库存储 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12373785/

相关文章:

rest - 在使用 FOSRestBundle 进行序列化期间检测到 Symfony 3.0.4 循环引用

symfony - SonataAdmin,左侧添加菜单

symfony - 如何在 Doctrine 3 中替换 EntityManager::merge?

arrays - 在哪里定义与 symfony2 中的实体相关的静态数组?

symfony - 如何在奏鸣曲管理中基于另一个表单字段创建动态表单字段?

php - 如何在 symfony2 中覆盖 sonata admin bundle 的 css

php - Symfony UrlGeneratorInterface::ABSOLUTE_URL

php - Symfony2 路由 : Two optional parameters - at least one required

php - Doctrine 连接表没有反射(reflect)

Symfony 2.0 KnpMenu 自定义模板