Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Сохранение данных в сессии
Форумы портала PHP.SU » PHP » Программирование на PHP » Сохранение данных в сессии

Страниц (1): [1]
 

1. Uchkuma - 06 Июля, 2010 - 10:45:41 - перейти к сообщению
У меня собственная полноценная CMS со всеми вытекающими. Настроен пользовательский механизм ведения сессий - сессии пользователей заносятся в БД.
Появилась проблема с использованием captcha, которой раньше я, возможно, просто не замечал. Обыкновенная страница с комментариями, где нужно ввести защитный код, чтобы добавить комментарий.
Итак.
1. Открываем страницу, из БД считывается сессия, в процессе выполнения скрипта могут изменяться какие-то переменные состояния пользователя в $_SESSION, скрипт отработал и данные сессии сохранились в БД.
2. Далее браузер запрашивает картинку капчи и следует тот же алгоритм -> считывание сессии, работа скрипта (который выводит капчу и сохраняет ее код в $_SESSION), сохранение сессии.
Так вот. Если второе отработало после первого, то все в порядке. Но иногда получается так, что браузер запрашивает картинку капчи и скрипт вывода капчи отрабатывает РАНЬШЕ, чем отрабатывается вывод страницы с комментариями.
В таком случае первый скрипт перезаписывает состояние сессии второго скрипта (т.к. отрабатывает позже) и код капчи не сохраняется.

Не знаю как это лучше побороть. Поставил пока тупо задержку sleep(2) в скрипт вывода капчи.
2. JustUserR - 06 Июля, 2010 - 16:07:47 - перейти к сообщению
Uchkuma пишет:
Не знаю как это лучше побороть. Поставил пока тупо задержку sleep(2) в скрипт вывода капчи
В многопоточных системах очень часто возникают похожие задачи и они имеют стандартные методы решения - причем можно сделать решение как на серверной стороне так и на клиентской
В качестве клиентского решения может выступать специальный JS-скрипт - когда вы выводите исходный HTML-код то не указываете в нем ресурс изображения капчи явно - а запрашиваете его через JS-скрипт который в свою очередь срабатывает при полном загрузке страницы onload Вообще для точного разграничения загрузки HTML-кода и подключаемых ресурсов можно использовать похожий подход - а именно в исходном HTML-коде все крупные и специальные внешние ресурсы не прописываются явно а загружаются через JS-скрипт В принципе этот метод можно распространить вообще на все подключаемые элементы - и в первую очередь загружать CSS стили и изображения дизайна и когда они загрузились то отображаться страницу и начинать загрузку оставшихся ресурсов
В качестве серверного решения можно предложить использование специального флага - например когда PHP-скрипт вывода страницы с комментариями завершает свою работу то он устанавливает соответствующую переменную в сессии или разделенной памяти - а PHP-скрипт вывода капчи содержит while-цикл с проверкой этой переменной и оператором sleep для ожидания ее получения Таким же образом нельзя будет запрашивать капчу без предварительного запроса соответствующей HTML-страницы
3. Uchkuma - 03 Марта, 2011 - 10:37:05 - перейти к сообщению
Ранее не приходилось углубляться в механизм работы сессий. На самом деле PHP, чтобы обеспечить целостность данных, блокирует файл сессии, пока сессия активна (не вызван session_write_close или не завершил работу скрипт). Т.о. второй запрос будет ждать завершения первого, т.е. все последовательно и данные не пропадут.

Но т.к. я использую собственный механизм сессий, то от PHP уже ничего не зависит. Как оказалось, ответ кроется в самом вопросе:
Uchkuma пишет:
Настроен пользовательский механизм ведения сессий - сессии пользователей заносятся в БД.
По сути требуется блокировка ряда таблицы с сессией на чтение и запись на время выполнения скрипта.

Тип таблицы MyISAM. Сейчас почитал - похоже, ряд блокировать нельзя. Только таблицу целиком.

 

Powered by ExBB FM 1.0 RC1