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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Сохранение данных в сессии

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Как сохранить состояние второго процесса?
Uchkuma
Отправлено: 06 Июля, 2010 - 10:45:41
Post Id



Участник


Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010  
Откуда: Киров


Помог: 6 раз(а)




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

Не знаю как это лучше побороть. Поставил пока тупо задержку sleep(2) в скрипт вывода капчи.
 
 Top
JustUserR
Отправлено: 06 Июля, 2010 - 16:07:47
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Uchkuma пишет:
Не знаю как это лучше побороть. Поставил пока тупо задержку sleep(2) в скрипт вывода капчи
В многопоточных системах очень часто возникают похожие задачи и они имеют стандартные методы решения - причем можно сделать решение как на серверной стороне так и на клиентской
В качестве клиентского решения может выступать специальный JS-скрипт - когда вы выводите исходный HTML-код то не указываете в нем ресурс изображения капчи явно - а запрашиваете его через JS-скрипт который в свою очередь срабатывает при полном загрузке страницы onload Вообще для точного разграничения загрузки HTML-кода и подключаемых ресурсов можно использовать похожий подход - а именно в исходном HTML-коде все крупные и специальные внешние ресурсы не прописываются явно а загружаются через JS-скрипт В принципе этот метод можно распространить вообще на все подключаемые элементы - и в первую очередь загружать CSS стили и изображения дизайна и когда они загрузились то отображаться страницу и начинать загрузку оставшихся ресурсов
В качестве серверного решения можно предложить использование специального флага - например когда PHP-скрипт вывода страницы с комментариями завершает свою работу то он устанавливает соответствующую переменную в сессии или разделенной памяти - а PHP-скрипт вывода капчи содержит while-цикл с проверкой этой переменной и оператором sleep для ожидания ее получения Таким же образом нельзя будет запрашивать капчу без предварительного запроса соответствующей HTML-страницы


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Uchkuma
Отправлено: 03 Марта, 2011 - 10:37:05
Post Id



Участник


Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010  
Откуда: Киров


Помог: 6 раз(а)




Ранее не приходилось углубляться в механизм работы сессий. На самом деле PHP, чтобы обеспечить целостность данных, блокирует файл сессии, пока сессия активна (не вызван session_write_close или не завершил работу скрипт). Т.о. второй запрос будет ждать завершения первого, т.е. все последовательно и данные не пропадут.

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

Тип таблицы MyISAM. Сейчас почитал - похоже, ряд блокировать нельзя. Только таблицу целиком.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB