С его файловыми сеансами ext/session
реализует защиту параллелизма в виде блокировки файлов в открытом сеансе. Блокировка файлов блокирует любую другую попытку открыть файл сеанса, и блокировка не освобождается до закрытия сеанса (либо в конце запроса, либо явно с session_write_close
).
Это эффективно сериализует доступ к сеансам, между тем и всего сеанса, который записывается сразу (а не как отдельные значения), не должно быть проблем с несогласованными данными.
Если вы выполняете правильную блокировку и изоляцию с помощью своей пользовательской реализации сеанса, вы делаете то же самое, что делает ext/session
, хотя с другим хранилищем.
Если вы хотите реализовать обработчик сеанса с использованием РНР SessionHandlerInterface
и session_set_save_handler
, вы бы осуществить это, делая блокировку как часть вашего open
реализации, захват и освобождение как часть вашего close
реализации.
С одновременных запросов, логика поток будет выглядеть примерно так:
Connection 1 Connection 2
session open session open - blocks
session read //blocked
// do stuff //blocked
session write //blocked
session close //blocked
session open returns
//reset of session handling as per normal
Поскольку Connection 2
полностью заблокирован после попытки открыть сеанс (и, прежде чем она получает данные сеанса), он не может принимать какие-либо действие, которое может нарушить данные в другом соединении, имеющем доступ к данным сеанса.
Обратите внимание, что пользовательский обработчик сеанса должен выполнить блокировку правильно, иначе вы можете получить несогласованные данные в результате нескольких одновременных доступов к данным сеанса. Какая форма этой несогласованности будет зависеть от конкретных деталей того, как пользовательский обработчик реализует чтение и запись данных сеанса.