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} | ||
| string | doRead(string $sessionId) Читает данные сессии с учетом различных стратегий блокировки. | |
| bool | doWrite(string $sessionId, string $data) | |
| bool | doDestroy(string $sessionId) | |
| 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} | ||
| PDO | getConnection() Возвращает экземпляр PDO. |
Подробное описание
open($savePath, $sessionName)
{@inheritdoc}
Параметры
| $savePath | ||
| $sessionName |
protected string doRead(string $sessionId)
Читает данные сессии с учётом различных стратегий блокировки.
Необходимо убедиться, что мы не возвращаем данные сессии, которые уже считаются мусором в соответствии с настройкой session.gc_maxlifetime, потому что gc() вызывается после read() и только иногда.
Параметры
| string | $sessionId |
Значение возврата
| string |
protected bool doWrite(string $sessionId, string $data)
Параметры
| string | $sessionId | |
| string | $data |
Значение возврата
| bool |
protected bool doDestroy(string $sessionId)
Параметры
| string | $sessionId |
Значение возврата
| bool |
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.
Список доступных параметров: * db_table: Название таблицы [по умолчанию: sessions] * db_id_col: Столбец, в котором хранится идентификатор сессии [по умолчанию: sess_id] * db_data_col: Столбец, в котором хранятся данные сессии [по умолчанию: sess_data] * db_lifetime_col: Столбец, в котором хранится срок действия [по умолчанию: sess_lifetime] * db_time_col: Столбец, в котором хранится отметка времени [по умолчанию: sess_time] * db_username: Имя пользователя при ленивом подключении [по умолчанию: ''] * db_password: Пароль при ленивом подключении [по умолчанию: ''] * db_connection_options: Массив параметров подключения, специфичных для драйвера [по умолчанию: array()] * lock_mode: Стратегия блокировки, см. константы [по умолчанию: LOCK_TRANSACTIONAL]
Параметры
| PDO|string|null | $pdoOrDsn | Экземпляр \PDO или строка DSN или строка URL или null |
| array | $options | Ассоциативный массив параметров |
Исключения
| InvalidArgumentException | Если режим ошибок PDO не PDO::ERRMODE_EXCEPTION |
createTable()
Создаёт таблицу для хранения сессий, которую можно вызвать один раз для настройки.
Идентификатор сессии сохраняется в столбце максимальной длины 128, так как этого достаточно даже для сессии с функцией хеширования, заданной как Whirlpool (512 бит). Данные сессии сохраняются в BLOB. Можно также использовать более короткий встроенный столбец varbinary, если уверены, что данные в него поместятся.
Исключения
| PDOException | Если таблица уже существует |
| DomainException | Если используется неподдерживаемый драйвер PDO |
bool isSessionExpired()
Возвращает true, когда текущая сессия существует, но истекла согласно session.gc_maxlifetime.
Может использоваться для различения новой сессии и сессии, истекшей из-за бездействия.
Значение возврата
| bool | Является ли текущая сессия просроченной |
gc($maxlifetime)
{@inheritdoc}
Параметры
| $maxlifetime |
updateTimestamp($sessionId, $data)
{@inheritdoc}
Параметры
| $sessionId | ||
| $data |
close()
{@inheritdoc}
protected PDO getConnection()
Возвращает экземпляр PDO.
Значение возврата
| PDO |
© 2004–2017 Fabien Potencier
Licensed under the MIT License.
https://api.symfony.com/4.1/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.html