SSE не отключается с использованием ignore_user_abort() и Connection_aborted().Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 SSE не отключается с использованием ignore_user_abort() и Connection_aborted().

Сообщение Anonymous »

Я взял пример SSE из W3 Schools и заметил, что с помощью Dev Tools он продолжает создавать новое соединение. Просматривая блог Кевина Чоппина, я изменил пример W3 Schools, чтобы использовать while(true) вместе с ignore_user_abort() и Connection_aborted(). Используя инструменты разработки, я теперь вижу одно постоянное соединение, но когда я закрываю вкладку или закрываю браузер, я не вижу, чтобы `connection_aborted()' возвращал true.
SSE Код: Обратите внимание: если я переместил file_put_contents() над проверкой Connection_aborted(), файл будет успешно записан. Так что это не проблема с разрешением.
Я заметил, что есть функция Connection_status(). Поэтому вместо этого я изменил код, чтобы использовать переключатель для отображения статуса.
Код SSE: С помощью этого кода файл постоянно записывается, и я получаю CONNECTION_NORMAL в качестве вывода.

Код: Выделить всё

ls -l /tmp/test ; cat /tmp/test
-rw-r--r-- 1   17 Jan 18 11:09 /tmp/test
CONNECTION_NORMAL
Соединение не прерывается, и мне трудно понять, почему. Я использую Microsoft Edge в качестве браузера, но также пробовал Chrome и Firefox. Я также полностью закрыл браузер и использовал диспетчер задач, чтобы завершить процесс. Прошло 20 минут, а временная метка все еще обновляется с CONNECTION_NORMAL.
Что касается клиентского кода, который запускается в браузере, он такой же, как в школах W3 пример.

Код: Выделить всё




Getting server updates


if(typeof(EventSource) !== "undefined") {
var source = new EventSource("demo_sse.php");
source.onmessage = function(event) {
document.getElementById("result").innerHTML += event.data + "
";
};
} else {
document.getElementById("result").innerHTML = "Sorry, your browser does not support server-sent events...";
}




Что касается серверной части, на сервере работает Apache.
Некоторые дополнительные сведения после просмотра этого ответа @JS_Riddler. Насколько я понимаю, PHP не может прервать соединение даже с помощью методаlush(), если вывод буферизуется. Я добавил цикл while с ob_get_contents() и ob_end_clean(), но безуспешно. Также я скопировал точный пример с классом DestructTester, и результат был одинаковым независимо от того, было ли ignore_user_abort() установлено в true или нет. Каждый отпечаток был НЕТ.
Код SSE: Еще одно обновление. Если на стороне клиента я использую source.close();, он все равно не обнаруживает прерванное соединение. Я также безуспешно пытался установить для параметра output_buffering значение 0 в php.ini. Кажется, это сломано.

Подробнее здесь: https://stackoverflow.com/questions/778 ... on-aborted
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»