У меня есть файл с именем handler.php, который считывает данные из текстового файла и передает их на страницу клиента.
Соответствующий код клиента:
<script>
if(typeof(EventSource) !== "undefined") {
var source = new EventSource("handler.php");
source.onmessage = function(event) {
var textarea = document.getElementById("subtitles");
textarea.value += event.data;
textarea.scrollTop = textarea.scrollHeight;
};
} else {
document.getElementById("subtitles").value = "Server-sent events not supported.";
}
</script>
Код Handler.php:
$id = 0;
$event = 'event1';
$oldValue = null;
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('X-Accel-Buffering: no');
while(true){
try {
$data = file_get_contents('liveData.txt');
} catch(Exception $e) {
$data = $e->getMessage();
}
if ($oldValue !== $data) {
$oldValue = $data;
echo 'id: ' . $id++ . PHP_EOL;
echo 'event: ' . $event . PHP_EOL;
echo 'retry: 2000' . PHP_EOL;
echo 'data: ' . json_encode($data) . PHP_EOL;
echo PHP_EOL;
@ob_flush();
@flush();
sleep(1);
}
}
При использовании цикла файл handler.php никогда не загружается, поэтому клиент не получает никаких данных.На вкладке «Сеть разработчиков Chrome» файл handler.php отображается как «Ожидание», а затем «Отменено».Сам файл остается заблокированным в течение 30 секунд.
Однако, если я удаляю цикл while (как показано ниже), handler.php загружается , а клиент делает получать данные (только один раз, хотя файл liveData.txt постоянно обновляется).
Handler.php без цикла:
$id = 0;
$event = 'event1';
$oldValue = null;
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('X-Accel-Buffering: no');
try {
$data = file_get_contents('liveData.txt');
} catch(Exception $e) {
$data = $e->getMessage();
}
if ($oldValue !== $data) {
$oldValue = $data;
echo 'id: ' . $id++ . PHP_EOL;
echo 'event: ' . $event . PHP_EOL;
echo 'retry: 2000' . PHP_EOL;
echo 'data: ' . json_encode($data) . PHP_EOL;
echo PHP_EOL;
@ob_flush();
@flush();
}
Я использую SSE, поскольку мне нужен только одиндвустороннее общение (так что веб-сокеты, вероятно, излишни), и я действительно не хочу использовать опрос.Если я не могу с этим разобраться, возможно, мне придется.