Intereting Posts

Страницы с session_start () не загружаются при запуске серверного события

Я работаю над небольшим проектом, чтобы создать чат-систему 1v1. Я хотел работать над проектом, где я мог бы использовать Server-Sent Events для хорошего использования. Он работает очень хорошо, но недавно я внес некоторые изменения в код, так что в общем чат будет более эффективным.

Когда я запускаю источник событий, я сталкиваюсь с какой-то странной проблемой. Когда я пытаюсь перейти на любую другую страницу PHP с session_start (), она не загружается.

Мой сценарий источника событий выглядит примерно так:

 <?php session_start(); require "connect.php"; require "user.php"; header("Content-Type: text/event-stream\n\n"); header('Cache-Control: no-cache'); set_time_limit(1200); $ms = 5000; //SOME MORE VARIABLES HERE while (1) { echo "data: SSESSION " . $_SESSION["conversation" . $_GET["id"]]; echo "\n\n"; /*CHAT SCRIPT HERE*/ ob_flush(); flush(); usleep($ms * 1000); } ?> 

То, что должен вернуть сеанс, – это количество строк для разговора. Это действительно так.

Если я test.php к test.php :

 <?php session_start(); echo $_SESSION["conversation121643"]; ?> 

Пока выполняется Server-Sent Event , эта страница продолжает загрузку до тех пор, пока я не отменит событие.

Я попытался использовать функцию ob_flush , но это ничего не исправить.

Я понятия не имею, почему у меня такая проблема. И я надеюсь, что это исправление.

PHP имеет исключительную блокировку вокруг сеанса. Можно использовать только один процесс за раз. Это, как правило, незаметно, потому что PHP-процессы начинаются и заканчиваются быстро, но с SSE вы сохраняете сеанс открытым навсегда, а все остальные процессы PHP будут ждать завершения процесса SSE.

Вы можете выполнить session_write_close() чтобы освободить сеанс для других процессов.