2016-02-04 3 views
4

Я всегда реализовал сеансовую обработку себя с помощью файлов cookie и баз данных, а не через php ext/session api.Пример проблемы параллельного параллелирования/сеанса параллелизма?

Я делаю это с помощью строчных замков и необходимой изоляции. Я никогда не сталкивался с проблемами параллелизма с моим методом, хотя я не думаю, что у меня достаточно трафика, чтобы выявить такие проблемы.

Мне недавно сообщили, что ext/session делает больше, чем можно было ожидать, и что это сложнее, чем я думаю, что заставило меня подвергнуть сомнению мой подход.

Можете ли вы привести пример параллельных запросов и способ, которым ext/session решает несоответствия данных?

ответ

2

С его файловыми сеансами 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 полностью заблокирован после попытки открыть сеанс (и, прежде чем она получает данные сеанса), он не может принимать какие-либо действие, которое может нарушить данные в другом соединении, имеющем доступ к данным сеанса.

Обратите внимание, что пользовательский обработчик сеанса должен выполнить блокировку правильно, иначе вы можете получить несогласованные данные в результате нескольких одновременных доступов к данным сеанса. Какая форма этой несогласованности будет зависеть от конкретных деталей того, как пользовательский обработчик реализует чтение и запись данных сеанса.

Смежные вопросы