AutopilotXX
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Очень много написано про перенос хранения сессий в базу данных. Но редко где упоминается такая фича, как отсутствие лока. При хранении сессий в файлах, файл сессии при открытии лочится и второй запрос браузера к серверу будет ждать пока первый не будет закончен, и файл сессии не освободится. Особенно такое поведение заметно при долгих операциях, типа импорта. При хранении сессий в базе лока нет и оба запроса будут обработаны одновременно. А запись обновления в сессию происходит при завершении работы скрипта. Однако может возникнуть ситуация, когда в результате первого запроса данные в сессии изменились, эта сессия сохранится раньше, чем закончится второй запрос, который об изменении не знает и который так же запишет свою сессию, сбросив данные первого запроса. Отсюда первое, что нужно делать - проверять при записи изменение времени у сессии, которую зачитали вначале и фиксировать коллизию. При этом пока что сессия не сохраняется. Спасибо, что дочитали и вникаете. В нашем движке в некоторых случаях статика может отдаваться через index.php, который всегда инициирует сессию. Так у нас отдается favicon.ico. (Этот файл может запрашивается браузером одновременно со страницей). Таким же образом отдаются картинки капчи, которая сохраняет проверочный код в сессии. И когда на странице оказываются две формы с двумя капчами возникает проблема. Оба процесса кладут в разные ключи сессии проверочный код, но в зависимости от порядка сохранения один из кодов будет потерян. Получается, нужно объединить сессии. Учитывая, что есть массив сессии, который считали вначале, есть текущий массив, с которым работали, удаляли, меняли, добавляли и есть массив сессии из базы, который был параллельно обновлен другим запросом. Как кто решает эту проблему? |