Server-Sent Eventsを試してみた
参考にしたサイトとほぼ同じコードですが、SSEで実行することができました!
Server-Sent Events の利用 - Server-sent events | MDN
- index.html
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <ul id="list"></ul> <script> var evtSource = new EventSource("ssedemo.php"); evtSource.addEventListener("ping", function(e) { var newElement = document.createElement("li"); var eventList = document.getElementById('list'); console.log(e.data); var obj = JSON.parse(e.data); newElement.innerHTML = "ping at " + obj.time; eventList.appendChild(newElement); }, false); evtSource.addEventListener("error",function(e){ console.log(e); alert("EventSource failed."); },false); </script> </body> </html>
- ssedemo.php
<?php date_default_timezone_set("America/New_York"); header("Content-Type: text/event-stream\n\n"); $counter = rand(1, 10); while (1) { // "ping" イベントを毎秒送信 echo "event: ping\n"; echo 'data: {"time": "' . (new DateTime())->format('Y/m/d H:i:s') . '"}'; echo "\n\n"; // シンプルなメッセージをランダムな間隔で送信 $counter--; if (!$counter) { echo "event: ping2\n"; echo 'data: This is a message at time ' . (new DateTime())->format('Y/m/d') . "\n\n"; $counter = rand(1, 10); } if (ob_get_contents()) ob_end_clean(); flush(); sleep(1); }
すごい!!