Symfony PdoSessionHandler与PostgreSql不能按预期工作

chi*_*enz 3 postgresql session symfony

我试图将php会话从文件移动到数据库。之后:pdo_session_storage我设置了symfony,如下所示:

config.yml:

session:
    handler_id:  session.handler.pdo
Run Code Online (Sandbox Code Playgroud)

services.yml:

session.handler.pdo:
    class:  Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler
    arguments:
        - "pgsql:host=%database_host_access%;port=%database_port_access%;dbname=%database_name_access%"
        - { db_username: %database_user_access%, db_password: %database_password_access% }
Run Code Online (Sandbox Code Playgroud)

可以正确看到数据库,并为每个会话在表中创建一行:sessions

问题是:每次我重新加载页面时,会话属性都会丢失。似乎数据是从零开始写入的,而不是附加到现有属性中。

通过一些调试,我发现NativeSessionStorage->loadSession()装入的数据$_SESSION为空,因此SessionHandlerProxy->write()写入具有空属性的数据。

NativeSessionStorage :: loadSession():

protected function loadSession(array &$session = null)
{
    if (null === $session) {
        $session = &$_SESSION;
    }

    $bags = array_merge($this->bags, array($this->metadataBag));

    foreach ($bags as $bag) {
        $key = $bag->getStorageKey();
        $session[$key] = isset($session[$key]) ? $session[$key] : array();
        $bag->initialize($session[$key]);
    }

    $this->started = true;
    $this->closed = false;
}
Run Code Online (Sandbox Code Playgroud)

哪里&$_SESSION;总是空的。

如果我mysql用作session.handler.pdo参数或让php通过文件管理会话,则不会出现此行为。

我找不到关于该主题的资源,我认为这不是一个小问题,有人提出了建议吗?

我正在使用Postgres版本9.4.1.0和Symfony版本2.6.5。

chi*_*enz 5

我发现了问题:PostgreSql 9.0版更改了默认hex格式的bytea输出,但Symfony处理了中的资源escape

临时解决方案可能是: ALTER DATABASE dbname SET bytea_output = 'escape';

这是git / symfony问题:https : //github.com/symfony/symfony/issues/14569