Я создаю некоторый webapp и реализовал длинный опрос (и очередь команд в моем db), поэтому мой сервер может асинхронно отправлять команды на мою cleint и т. Д. Команды кодируются в json и отправляются через ajax-вызовы для клиента на сервер, и через длительный опрос для сервера по-клиентски.
Все работало нормально, пока я не включил свой «модуль аутентификации» в файл ajax.php. Этот модуль обертывает материал сеанса и вызывает session_start ().
Проблема в том, что моя долгая процедура опроса может подождать до 21 секунды, прежде чем вернуться к клиенту. За это время сервер не будет запускать что-либо из того же сеанса. Вместо этого он выполняется сразу после возвращения длинного запроса ajax.
Я понимаю, что, возможно, есть ограничение только на 1 поток за сеанс за раз, и что запросы находятся в очереди.
Теперь вот вопрос: как лучше всего это решить? Есть ли параметр, позволяющий несколько потоков за сеанс (3 в порядке). Или я просто отправлю сообщение клиенту, что такое его SessionID (у меня есть таблица сеансов в моем db, чтобы отслеживать, какой пользователь подключен к тому или иному сеансу). Затем клиент может отправить его вместе с любыми вызовами ajax, чтобы модуль аутентификации мог быть обойден.
В более позднем варианте iam боится, что он откроет кучу проблем безопасности из-за возможного спуфинга сеанса. Мне нужно будет отправить «случайную строку» на каждый сеанс, чтобы убедиться, что вы не можете легко обманывать, но даже тогда это не идеально …
Спасибо за тэгов 🙂
Николас Готье
Хорошо известно, что PHP блокирует файлы сеанса на время их использования, чтобы предотвратить условия гонки.
Если вы посмотрите исходный код PHP (ext / session / mod_files.c), вы увидите, что функция ps_files_open
блокирует файл сеанса, а ps_files_close
разблокирует его.
Если вы вызываете session_start()
в начале вашего долго работающего скрипта и не закрываете явный файл сеанса, он будет заблокирован до тех пор, пока сценарий не завершится, где PHP выдает все блокировки файлов во время выключения скрипта.
Пока вы не используете сеанс, вы должны вызвать session_write_close
чтобы очистить данные сеанса до диска и отпустить блокировку, чтобы ваши другие «потоки» могли читать данные.
Я уверен, вы можете себе представить, что произойдет, если файл не заблокирован.
T1: Open Session T2: Open Session ... T2: Write Data T1: Write Data
Данные, написанные потоком 2, будут полностью перезаписаны потоком 1, и в то же время любые данные, которые поток 1 хотел выписать, не были доступны для потока 2.