PdoSessionHandler
class PdoSessionHandler implements SessionHandlerInterface
Обработчик сессий, использующий подключение PDO для чтения и записи данных.
Он работает с MySQL, PostgreSQL, Oracle, SQL Server и SQLite и реализует различные стратегии блокировки для обработки одновременного доступа к одной и той же сессии. Блокировка необходима для предотвращения потери данных из-за гонок и для поддержания согласованности данных сессии между read() и write(). При использовании блокировки запросы к одной и той же сессии будут ожидать, пока другая сессия не завершит запись. По этой причине лучшей практикой является как можно более раннее закрытие сессии для повышения конкурентности. Внутренний обработчик файлов сессий PHP также реализует блокировку.
Внимание: так как SQLite не поддерживает блокировки на уровне строк, но блокирует всю базу данных, это означает, что к одной сессии может обращаться только одна сессия. Даже разные сессии будут ждать завершения другой. Таким образом, сохранение сессии в SQLite следует рассматривать только для разработки или прототипов.
Данные сессии представляют собой двоичную строку, которая может содержать непропечатываемые символы, такие как нулевой байт. По этой причине они должны сохраняться в двоичном столбце в базе данных, таком как BLOB в MySQL. Сохранение их в символьных столбцах может привести к повреждению данных. Вы можете использовать createTable(), чтобы инициализировать правильно определённую таблицу.
Постоянные значения
| LOCK_NONE | Блокировка не выполняется. Это означает, что сессии подвержены потере данных из-за гонок при одновременных запросах к одной и той же сессии. В этом случае последняя запись сессии победит. Это может быть полезно, когда вы реализуете свою собственную логику для обработки этого, например, оптимистический подход. |
| LOCK_ADVISORY | Создаёт блокировку на уровне приложения для сессии. Недостатком является то, что блокировка не накладывается базой данных, и, следовательно, другие части приложения, не знающие об этом, могут по-прежнему изменять сессию одновременно. Преимущество состоит в том, что она не требует транзакции. Этот режим недоступен для SQLite и ещё не реализован для oci и sqlsrv. |
| LOCK_TRANSACTIONAL | Создаёт реальную блокировку на уровне строк. Поскольку он использует транзакцию между открытием и закрытием сессии, вам необходимо быть осторожными, когда вы используете одно и то же подключение к базе данных, которое вы также используете для логики вашего приложения. Этот режим является по умолчанию, потому что это единственное надёжное решение для разных СУБД. |
Методы
| __construct(PDO|string|null $pdoOrDsn = null, array $options = array()) Конструктор. | ||
| createTable() Создаёт таблицу для хранения сессий, которую можно вызвать один раз для настройки. | ||
| bool | isSessionExpired() Возвращает true, когда текущая сессия существует, но истекла согласно session.gc_maxlifetime. | |
| open($savePath, $sessionName) {@inheritdoc} | ||
| read($sessionId) {@inheritdoc} | ||
| gc($maxlifetime) {@inheritdoc} | ||
| destroy($sessionId) {@inheritdoc} | ||
| write($sessionId, $data) {@inheritdoc} | ||
| close() {@inheritdoc} |
Подробности
__construct(PDO|string|null $pdoOrDsn = null, array $options = array())
Конструктор.
Вы можете передать существующее подключение к базе данных как экземпляр PDO или передать строку DSN, которая будет использоваться для ленивого подключения к базе данных, когда сессия фактически используется. Кроме того, вы можете передать null, который затем будет использовать параметр DSN ini-настройки session.save_path.
Список доступных параметров: * dbtable: Название таблицы [по умолчанию: sessions] * dbidcol: Столбец, в котором хранится идентификатор сессии [по умолчанию: sessid] * dbdatacol: Столбец, в котором хранятся данные сессии [по умолчанию: sessdata] * dblifetimecol: Столбец, в котором хранится срок действия [по умолчанию: sesslifetime] * dbtimecol: Столбец, в котором хранится временная метка [по умолчанию: sesstime] * dbusername: Имя пользователя при ленивом подключении [по умолчанию: ''] * dbpassword: Пароль при ленивом подключении [по умолчанию: ''] * dbconnectionoptions: Массив параметров подключения, специфичных для драйвера [по умолчанию: array()] * lockmode: Стратегия блокировки, см. постоянные значения [по умолчанию: LOCK_TRANSACTIONAL]
Параметры
| PDO|string|null | $pdoOrDsn | Экземпляр \PDO или строка DSN или null |
| array | $options | Ассоциативный массив параметров |
Исключения
| InvalidArgumentException | Если режим ошибок PDO не PDO::ERRMODE_EXCEPTION |
createTable()
Создаёт таблицу для хранения сессий, которую можно вызвать один раз для настройки.
Идентификатор сессии сохраняется в столбце максимальной длины 128, поскольку этого достаточно даже для функции хэширования сессии с конфигурацией 512 бит, такой как Whirlpool. Данные сессии сохраняются в BLOB. Можно также использовать более короткий встроенный столбец varbinary, если вы уверены, что данные поместятся в него.
Исключения
| PDOException | Если таблица уже существует |
| DomainException | Если используется неподдерживаемый драйвер PDO |
bool isSessionExpired()
Возвращает true, когда текущая сессия существует, но истекла согласно session.gc_maxlifetime.
Может использоваться для различения новой сессии и сессии, истекшей из-за бездействия.
Значение возврата
| bool | Истекла ли текущая сессия |
open($savePath, $sessionName)
{@inheritdoc}
Параметры
| $savePath | ||
| $sessionName |
read($sessionId)
{@inheritdoc}
Параметры
| $sessionId |
gc($maxlifetime)
{@inheritdoc}
Параметры
| $maxlifetime |
destroy($sessionId)
{@inheritdoc}
Параметры
| $sessionId |
write($sessionId, $data)
{@inheritdoc}
Параметры
| $sessionId | ||
| $data |
close()
{@inheritdoc}
© 2004–2017 Fabien Potencier
Licensed under the MIT License.
http://api.symfony.com/3.0/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.html