Symfony2.3 PDOH и слишком много сессий создано по запросу

0

Я использую Symfony2.3 вместе со своим встроенным инструментом PDOSessionHandler для хранения сеансов в базе данных. По какой-то причине кажется, что в каждом запросе записывается несколько сеансов, и из-за этого у меня возникают проблемы при входе в систему. Вот моя конфигурация сеанса PDO:

parameters:
    pdo.db_options:
        db_table:    Session
        db_id_col:   id
        db_data_col: session_value
        db_time_col: session_time    
services:
    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

    session.handler.pdo:
        class:    Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler
        arguments:
            - "@pdo"
            - "%pdo.db_options%"

Скажем, я делаю один запрос GET на https://acme.mybundle.com/app_dev.php в качестве анонимного пользователя. Затем это пример вывода, который я увижу в таблице Session:

+----+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+
| id | session_value                                                                                                                                                                                                                                                                    | session_time |
+----+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+
|  1 | X3NmMl9hdHRyaWJ1dGVzfGE6MTp7czozNDoiX3NlY3VyaXR5LnNlY3VyZWRfYXJlYS50YXJnZXRfcGF0aCI7czozODoiaHR0cHM6Ly9hbGxlbmNvLmRldi5hdmF0YXJuZXd5b3JrLmNvbS8iO31fc2YyX2ZsYXNoZXN8YTowOnt9X3NmMl9tZXRhfGE6Mzp7czoxOiJ1IjtpOjE0MTU2MjU4ODQ7czoxOiJjIjtpOjE0MTU2MjU4ODQ7czoxOiJsIjtzOjE6IjAiO30= |   1415625884 |
|  2 | X3NmMl9hdHRyaWJ1dGVzfGE6MDp7fV9zZjJfZmxhc2hlc3xhOjA6e31fc2YyX21ldGF8YTozOntzOjE6InUiO2k6MTQxNTYyNTg4NDtzOjE6ImMiO2k6MTQxNTYyNTg4NDtzOjE6ImwiO3M6MToiMCI7fQ==                                                                                                                     |   1415625884 |
+----+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+

Если вам это нужно, вот мой файл security.yml:

security:
    encoders:
        Symfony\Component\Security\Core\User\User: plaintext
        Acme\MyBundle\Entity\User: sha512
    providers:
        main:
            id: acme.user.provider
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        login_firewall:
            pattern: ^/login$
            security: false
        secured_area:
            pattern: ^/
            form_login: ~
            logout:
                path:   /logout
                target: /
    access_control:
        - { path: ^/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
        - { path: ^/, roles: ROLE_USER, requires_channel: https }

После 1-5 попыток я обычно могу войти в систему, и для любых будущих запросов больше не создаются сеансы. Наконец, наш сервер находится за прокси-сервером, если это имеет значение. Кто-нибудь знает, почему несколько Списков записываются в каждом Запросе? Благодарю!

Теги:
session
pdo

1 ответ

0

Оказывается, проблема связана с моей сущностью ORM Session. У меня была следующая запись для $id:

<?php

namespace Acme\MyBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Session
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Session
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

//...
}

Идентификатор сессии $id не должен быть целым числом - это должна быть строка (очевидно, она также не должна быть автоматически увеличена. У меня было много derps после обнаружения этой ошибки). После перезаписи записи $id моего класса:

/**
 * @var string
 *
 * @ORM\Column(type="string", length=255)
 * @ORM\Id
 */
private $id;

и запуск php app/console doctrine:schema:update --force, все работает правильно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню