2014-12-13 2 views
1

Я хочу написать просмотрщик журналов в реальном времени и только что узнал о SSE. Я смущен тем, как правильно использовать его. Я запускаю сервер Linux с php 5.4. У меня есть этот код прямо сейчас:SSE не поддерживает связь

HTML + JS:

<!DOCTYPE html> 
<html> 
<head> 
</head> 
<body> 
    <ul id='el'></ul> 
    <script type="text/javascript"> 
     var eSource = new EventSource("ssedemo.php"); 
     eSource.onmessage = function(event) { 
      var e = document.createElement("li"); 
      e.innerHTML = event.data; 
      document.getElementById('el').appendChild(e); 
     }; 
    </script> 
</body> 
</html> 

PHP:

<?php 
header('Content-Type: text/event-stream'); 
header('Cache-Control: no-cache'); 
$time = date('r'); 
echo "data: The server time is: {$time}\n\n"; 
ob_flush(); 
flush(); 
?> 

Это работает, но он разрывает соединение после каждого обновления и клиента восстанавливает его каждый 3 секунды. Я бы хотел, чтобы он обновлялся быстрее. Из документации и руководств в Интернете, кажется, что правильный способ использовать SSE, чтобы обернуть код сервера в цикле для поддержания соединения, а также использовать sleep для управления временем обновления:

<?php 
header('Content-Type: text/event-stream'); 
header('Cache-Control: no-cache'); 
while(true) { 
    $time = date('r'); 
    echo "data: The server time is: {$time}\n\n"; 
    ob_flush(); 
    flush(); 
    sleep(1); 
}; 
?> 

Проблема заключается в том, что это не работает. Всякий раз, когда я вводил цикл, onmessage никогда не вызывается на стороне клиента. Я пробовал множество примеров без изменения кода(), (https://developer.mozilla.org/en-US/docs/Server-sent_events/Using_server-sent_events) и т. Д., Но никто из них не работает, если я не удаляю цикл из php.

Почему я не могу поддерживать соединение? Что-то изменилось в php 5.4, что мешает этому работать?

+0

Какой браузер вы используете? И это сервер localhost или удаленный сервер? –

+0

удаленный сервер. Я пробовал с Chrome, Firefox и IE, одинаковое поведение во всех случаях. – Cbas

+1

Будучи второстепенным, я полагаю, что у вас нет вывода вообще с вашим первым примером (no-while-loop) с IE (поскольку он не поддерживает SSE)? –

ответ

1

Чтобы ответить на ваш последний вопрос, в php 5.4 не было изменений, которые бы остановили работу.

Все выглядит правильно для меня. Вместо onmessage я всегда так:

eSource.addEventHandler('message', function(event) { 
    var e = document.createElement("li"); 
    e.innerHTML = event.data; 
    document.getElementById('el').appendChild(e); 
}, false); 

Но я думаю, что в любом случае это хорошо. (Подтверждено вам говорю, что это работает, когда нет петли в то время, и только один пакет данных передается.)

Таким образом, все, что я могу сделать, это предложить несколько идей по устранению неполадок:

Вы можете использовать Firebug, или консоль разработчика Chrome, чтобы узнать, что делает соединение?

Вы видите, что это немедленно закрывается (что подразумевает некоторую синтаксическую ошибку или другую ошибку в вашем PHP-скрипте), или она остается открытой навсегда, но не получает никаких данных (что подразумевает наличие кеширования на стороне сервера, или промежуточное кэширование прокси-сервера), либо он остается открытым навсегда, и получает данные (что может свидетельствовать о том, что что-то не так с вашим JavaScript).

Также проверьте консоль JS для любых предупреждений и проверьте серверный журнал ошибок PHP для предупреждений.

+0

На консоли Chrome отсутствуют JS-предупреждения/ошибки, и соединение остается открытым без получения данных - оно показывает «Ожидание», а затем отменяется примерно через 2 минуты ,Я включил журналы отладки на моем сервере, и был создан новый файл журнала, но ошибки не появились после обновления демонстрационной страницы несколько раз. – Cbas

+0

@Cbas Interesting; это определенно звучит как проблема на стороне сервера (или промежуточный брандмауэр или балансировщик нагрузки). Возможно, стоит добавить к вашему вопросу: какой дистрибутив Linux и если он является общим или выделенным сервером и что вы знаете о сетевой топологии. Я был бы заинтересован/удивлен, если бы вы могли воспроизвести проблему со свежим экземпляром EC2 (или аналогичным). –

+0

Я тоже так думаю. Я использую общедоступную учетную запись хостинга, и когда я позвонил своему провайдеру услуг, они сказали, что ОС - это старый, настраиваемый дистрибутив Linux, который больше не поддерживается их ИТ-отделом - вероятно, корень проблемы. Я собираюсь переключиться на другую учетную запись хостинга на более новом дистрибутиве Linux и опубликовать результаты. – Cbas

Смежные вопросы