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, который затем будет использовать значение 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 error mode не равен PDO::ERRMODE_EXCEPTION |
createTable()
Создаёт таблицу для хранения сессий, которая может быть вызвана один раз для настройки.
Идентификатор сессии сохраняется в столбце максимальной длины 128, так как этого достаточно даже для функции session.hash_function с 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.1/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.html