Я работаю над небольшим проектом, чтобы создать чат-систему 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()
чтобы освободить сеанс для других процессов.