Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » [PHP] Сессии в mysql и коллизии.

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

AutopilotXX



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

Всего записей: 4 | Зарегистр. 27-11-2015 | Отправлено: 13:18 01-02-2018
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AutopilotXX
используйте memcached или redis для хранения информации, а потом запись в базу
либо сохраняете переменные сессии при каждом изменении, а не после завершения скрипта (накладно)

Всего записей: 15023 | Зарегистр. 20-09-2014 | Отправлено: 18:55 01-02-2018 | Исправлено: Mavrikii, 19:18 01-02-2018
AutopilotXX



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
В первом предложении возвращаемся к тому от чего уходили - хранение php сессий раздельно по сайтам.  
Это плюс решения с mysql от которого не хочется отказываться. И memcached не доступен на шаред хостингах, как и, наверняка, многие подобные хранилища.  
 
По второму от коллизий не спасет и да, накладно, к тому же потребует переписать в коде все упоминания _SESSION.  
 
Пока вариант переписать капчу на хранение хеша результата в куке и отбрасывать "опоздавшие" сессии.

Всего записей: 4 | Зарегистр. 27-11-2015 | Отправлено: 11:53 02-02-2018
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AutopilotXX
в целом - скрипт для капчи не должен так медленно выполняться, чтобы произошла коллизия.
если же он долго выполняется - нужно оптимизировать

Всего записей: 15023 | Зарегистр. 20-09-2014 | Отправлено: 20:58 02-02-2018
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Интернет » Web-программирование » [PHP] Сессии в mysql и коллизии.


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru