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} | ||
| 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} |
Подробности
open($savePath, $sessionName)
{@inheritdoc}
Параметры
| $savePath | ||
| $sessionName |
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.
Список доступных опций: * 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 | Была ли текущая сессия истекла |
gc($maxlifetime)
{@inheritdoc}
Параметры
| $maxlifetime |
updateTimestamp($sessionId, $data)
{@inheritdoc}
Параметры
| $sessionId | ||
| $data |
close()
{@inheritdoc}
© 2004–2017 Fabien Potencier
Licensed under the MIT License.
http://api.symfony.com/3.4/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.html