Как реализовать события Server Sent в PHP?

Я установил событие, отправленное сервером script с php и while, я не хотел, чтобы script продолжал закрываться и должен был перепрофилировать, поэтому я помещал все это в цикл while.

Проблема заключалась в том, что script застрял, и мне пришлось отказаться от этого маршрута, и вместо этого я использовал node.js websocket backend.

Мой вопрос: если я когда-нибудь вернусь к серверу, отправившему событие PHP скрипт, как его реализовать?
Циклы while, похоже, не режут его, поскольку он зависает script, и если он просто подключается и отключается каждую секунду, это ничем не отличается от длинного опроса, так как я могу создать PHP скрипт, который не будет зависать, а также отправлять сообщения SSE?

Ответ 1

У вас, похоже, проблема с буферизацией вывода php. Попробуйте добавить эту строку в конец цикла while:

ob_flush();
flush();

Это должно отключить буферизацию вывода.

EDIT Вы можете также завершить script через некоторое время (например, 10 минут), чтобы уменьшить нагрузку на сервер.

Я создал для вас библиотеку, чтобы сделать это очень легко. Проверьте здесь.

Второе редактирование У вас есть обратный прокси-сервер, такой как nginx или лак? Это может быть причиной, потому что прокси пытается кэшировать содержимое вывода, но SSE script никогда не заканчивается, пока вы не остановите его, чтобы все зависало. Другие вещи, которые захватывают вывод, могут иметь похожие результаты, такие как mod_deflate.

Третье редактирование Если у вас есть обратный прокси-сервер, вы можете попытаться отключить кеширование, чтобы SSE мог работать.

В PHP есть другие способы отключить буферизацию вывода. См. Код ниже:

<?php
for($i=0;$i<ob_get_level();$i++){
    ob_end_flush();
}
@apache_setenv('no-gzip',1);
@ini_set('implict_flush',1);
ob_implict_flush(true);