PdoSessionHandler
класс PdoSessionHandler реализует 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()) Вы можете передать существующее соединение с базой данных как экземпляр PDO или передать строку DSN, которая будет использоваться для ленивой связи с базой данных, когда сессия будет фактически использована. Кроме того, вы можете передать null, который затем будет использовать параметр ini session.save_path в качестве параметра DSN PDO. | ||
| 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, который затем будет использовать параметр 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 | Является ли текущая сессия истекшей |
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/2.7/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.html