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 не 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.2/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.html