@Ualde

Server Side Events отдает данные все разом, а не потоком. В чем ошибка?

Проблема следующая, есть 2 части скрипта SSE (на php и html+js) и когда скрипт работает на локальной машине (windows + nginx + php), то он выполняется всю длительность php-скрипта и отдает информацию разом, а не "кусочками" для стрима. В чем может быть проблема?
То ли дело в настройках PHP, то ли NGINX..

Код серверный:
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');

function send_message($id, $message) {
    echo "id: $id" . PHP_EOL;
    echo "data: " . json_encode(array('message' => $message)) . PHP_EOL;
    echo PHP_EOL;

    ob_flush();
    flush();
}

for($i = 0; $i < 10; $i++) {
    send_message($i, 'server time: ' . date("H:i:s", time()));
    sleep(1);
}

send_message(0, 'CLOSE');


Код клиентский:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <script>
        var source = '';

        function start_task() {
            source = new EventSource('1.php');

            source.addEventListener('message', function(e) {
                var result = JSON.parse(e.data);
                add_log(result.message);

                if (e.data.search('CLOSE') != -1) source.close();
            });

            source.addEventListener('error', function(e) {
                add_log('ERROR');
                source.close();
            });
        }

        function stop_task() {
            source.close();
            add_log('STOPPED');
        }

        function add_log(message){
            var r = document.getElementById('results');
            r.innerHTML += message + '<br>';
            r.scrollTop = r.scrollHeight;
        }
    </script>
</head>
<body>
    <input type="button" onclick="start_task();" value="Start"> <input type="button" onclick="stop_task();" value="Stop">
    <br />

    Лог
    <div id="results" style="height:200px; overflow:auto; background:#eee;"></div>
</body>
</html>
  • Вопрос задан
  • 251 просмотр
Решения вопроса 1
Проверьте буфферизацию в nginx
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы