nepster-web
@nepster-web

SSE php и javascript

Работаю с библиотекой EventSource.

Нужно обновлять данные на странице в релтайме.

Клиент:
<script type="text/javascript">
                    var es = new EventSource("/games/game/updateProposal/?id=<?=$proposal->proposal_id?>");
  
                    var open = function (event) 
                    {
                        console.log('Открытие');
                        
                        
                    }; 
                    
                    var listener = function (event) 
                    {
                        console.log('OK');
                        
                        //event.data = JSON.parse(event.data);
                        
                        console.log(event.data);
                    };  
                        
                      
                    
                    var error = function (event) 
                    {
                        console.log('Ошибка');
                    }; 
                
                    
                    es.addEventListener("open", open);
                    es.addEventListener("message", listener);
                    es.addEventListener("error", error);
                </script>


Сервер:
{   
        header('Content-Type: text/event-stream');
        header('Cache-Control: no-cache'); // recommended to prevent caching of event data.
        
        
        $lastEventId = floatval(isset($_SERVER["HTTP_LAST_EVENT_ID"]) ? $_SERVER["HTTP_LAST_EVENT_ID"] : 0);
        if ($lastEventId == 0) 
        {
            $lastEventId = (isset($_GET["key"])) ? (string)$_GET["key"] : 0;
        }
        
        $w = array(
            
            array('test1'=>1),
            array('test2'=>2),
            array('test3'=>3),
        
        );
        
        $data = ProcessingData::load()->getJson($w);
        
        
        echo "id: {$lastEventId}" . PHP_EOL;
        echo "data: $data" . PHP_EOL;
        echo PHP_EOL;
        
        
        sleep(5);
        
        ob_flush();
        flush();
        
    }


Возникло несколько вопросов:

1) Сервер отвечает 3 строками
1) id последнего эвента
2) данные
3) пустая строка
Пытался убрать пустую строку (echo PHP_EOL;) и в listener больше не попадаем.
Для чего эта пустая строка и почему ее нельзя убрать?

2) Если убрать (echo PHP_EOL;) мы попадаем в событие старта и ошибки, если все хорошо попадаем во все 3 события. Почему в любом случае мы попадаем в событие ошибки ?
  • Вопрос задан
  • 4300 просмотров
Пригласить эксперта
Ответы на вопрос 1
avalak
@avalak
1. Пустая строка это часть протокола.
2. error возникает и при закрытии соединения.
Ответ написан
Ваш ответ на вопрос

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

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