Spec-Zone.ru › Symfony 4.1

PdoSessionHandler

class PdoSessionHandler extends AbstractSessionHandler

Обработчик сессий, использующий соединение PDO для чтения и записи данных.

Он работает с MySQL, PostgreSQL, Oracle, SQL Server и SQLite и реализует различные стратегии блокировки для обработки одновременного доступа к одной и той же сессии. Блокировка необходима для предотвращения потери данных из-за гонок и для поддержания согласованности данных сессии между read() и write(). При блокировке запросы к одной и той же сессии будут ожидать завершения записи другой. По этой причине рекомендуется как можно скорее закрывать сессию, чтобы повысить конкуретность. Внутренний обработчик сессий PHP также реализует блокировку.

Внимание: Поскольку SQLite не поддерживает блокировки на уровне строк, но блокирует всю базу данных, это означает, что к одной сессии может получить доступ только один пользователь. Даже разные сессии будут ждать, пока другая не завершит свою работу. Поэтому сохранение сессий в SQLite следует рассматривать только для разработки или прототипов.

Данные сессии представляют собой двоичную строку, которая может содержать непечатаемые символы, такие как нулевой байт. Поэтому они должны сохраняться в двоичном столбце в базе данных, например, в BLOB в MySQL. Сохранение их в символьном столбце может привести к повреждению данных. Вы можете использовать createTable() для инициализации правильно определенной таблицы.

Константы

LOCK_NONE

Блокировка не выполняется. Это означает, что сессии подвержены потере данных из-за гонок при одновременных запросах к одной и той же сессии. В этом случае последняя запись сессии будет иметь приоритет. Это может быть полезно, когда вы реализуете собственную логику обработки этого, например, оптимистичный подход.

LOCK_ADVISORY

Создает блокировку на уровне приложения для сессии. Недостатком является то, что блокировка не обеспечивается базой данных, и поэтому другие части приложения, не знающие об этой блокировке, всё еще могут одновременно изменять сессию. Преимущество заключается в том, что это не требует транзакции.

Этот режим недоступен для SQLite и еще не реализован для oci и sqlsrv.

LOCK_TRANSACTIONAL

Вызывает реальную строковую блокировку. Поскольку при открытии и закрытии сессии используется транзакция, следует быть внимательным, когда вы используете то же соединение с базой данных, что и для логики вашего приложения. Этот режим является по умолчанию, поскольку это единственное надёжное решение для разных СУБД.

Методы

open($savePath, $sessionName)

{@inheritdoc}

string doRead(string $sessionId)

Читает данные сессии с учетом различных стратегий блокировки.

bool doWrite(string $sessionId, string $data)
bool doDestroy(string $sessionId)
validateId($sessionId)

{@inheritdoc}

from AbstractSessionHandler
read($sessionId)

{@inheritdoc}

write($sessionId, $data)

{@inheritdoc}

from AbstractSessionHandler
destroy($sessionId)

{@inheritdoc}

from AbstractSessionHandler
__construct(PDO|string|null $pdoOrDsn = null, array $options = array())

Вы можете передать существующее подключение к базе данных как экземпляр PDO или передать строку DSN, которая будет использоваться для ленивой связи с базой данных, когда сессия будет фактически использована. Кроме того, можно передать null, который затем будет использовать параметр ini session.save_path как параметр DSN PDO.

createTable()

Создает таблицу для хранения сессий, которая может быть вызвана один раз для настройки.

bool isSessionExpired()

Возвращает true, когда текущая сессия существует, но истекла в соответствии с session.gc_maxlifetime.

gc($maxlifetime)

{@inheritdoc}

updateTimestamp($sessionId, $data)

{@inheritdoc}

close()

{@inheritdoc}

PDO getConnection()

Возвращает экземпляр PDO.

Подробное описание

open($savePath, $sessionName)

{@inheritdoc}

Параметры

$savePath
$sessionName

protected string doRead(string $sessionId)

Читает данные сессии с учётом различных стратегий блокировки.

Необходимо убедиться, что мы не возвращаем данные сессии, которые уже считаются мусором в соответствии с настройкой session.gc_maxlifetime, потому что gc() вызывается после read() и только иногда.

Параметры

string $sessionId

Значение возврата

string

protected bool doWrite(string $sessionId, string $data)

Параметры

string $sessionId
string $data

Значение возврата

bool

protected bool doDestroy(string $sessionId)

Параметры

string $sessionId

Значение возврата

bool

validateId($sessionId)

{@inheritdoc}

Параметры

$sessionId

read($sessionId)

{@inheritdoc}

Параметры

$sessionId

write($sessionId, $data)

{@inheritdoc}

Параметры

$sessionId
$data

destroy($sessionId)

{@inheritdoc}

Параметры

$sessionId

__construct(PDO|string|null $pdoOrDsn = null, array $options = array())

Можно передать существующее подключение к базе данных как экземпляр PDO или строку DSN, которая будет использоваться для ленивого подключения к базе данных, когда сессия фактически используется. Кроме того, можно передать null, который затем будет использовать ini-настройку session.save_path в качестве параметра DSN PDO.

Список доступных параметров: * db_table: Название таблицы [по умолчанию: sessions] * db_id_col: Столбец, в котором хранится идентификатор сессии [по умолчанию: sess_id] * db_data_col: Столбец, в котором хранятся данные сессии [по умолчанию: sess_data] * db_lifetime_col: Столбец, в котором хранится срок действия [по умолчанию: sess_lifetime] * db_time_col: Столбец, в котором хранится отметка времени [по умолчанию: sess_time] * db_username: Имя пользователя при ленивом подключении [по умолчанию: ''] * db_password: Пароль при ленивом подключении [по умолчанию: ''] * db_connection_options: Массив параметров подключения, специфичных для драйвера [по умолчанию: array()] * lock_mode: Стратегия блокировки, см. константы [по умолчанию: LOCK_TRANSACTIONAL]

Параметры

PDO|string|null $pdoOrDsn Экземпляр \PDO или строка DSN или строка URL или null
array $options Ассоциативный массив параметров

Исключения

InvalidArgumentException Если режим ошибок PDO не PDO::ERRMODE_EXCEPTION

createTable()

Создаёт таблицу для хранения сессий, которую можно вызвать один раз для настройки.

Идентификатор сессии сохраняется в столбце максимальной длины 128, так как этого достаточно даже для сессии с функцией хеширования, заданной как Whirlpool (512 бит). Данные сессии сохраняются в BLOB. Можно также использовать более короткий встроенный столбец varbinary, если уверены, что данные в него поместятся.

Исключения

PDOException Если таблица уже существует
DomainException Если используется неподдерживаемый драйвер PDO

bool isSessionExpired()

Возвращает true, когда текущая сессия существует, но истекла согласно session.gc_maxlifetime.

Может использоваться для различения новой сессии и сессии, истекшей из-за бездействия.

Значение возврата

bool Является ли текущая сессия просроченной

gc($maxlifetime)

{@inheritdoc}

Параметры

$maxlifetime

updateTimestamp($sessionId, $data)

{@inheritdoc}

Параметры

$sessionId
$data

close()

{@inheritdoc}

protected PDO getConnection()

Возвращает экземпляр PDO.

Значение возврата

PDO

© 2004–2017 Fabien Potencier
Licensed under the MIT License.
https://api.symfony.com/4.1/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API