Baseline Widely available *
ãµã¼ãã¼éä¿¡ã¤ãã³ã (Server-Sent Events) ã使ç¨ããã¦ã§ãã¢ããªã±ã¼ã·ã§ã³ã®éçºã¯ç°¡åã§ãããµã¼ãã¼ä¸ã§ããã³ãã¨ã³ãã¸ã¤ãã³ããæµãããã«å¿ è¦ã«ãªãã³ã¼ãã¯ãããã§ãããã¯ã©ã¤ã¢ã³ãå´ã®ã³ã¼ãã¯ã¦ã§ãã½ã±ããã§å ¥ã£ã¦ããã¤ãã³ããæ±ãé¨åã¨ã»ã¼åãåä½ããã¾ããããã¯åæ¹åã®æ¥ç¶ã§ãã®ã§ãã¯ã©ã¤ã¢ã³ããããµã¼ãã¼ã¸ã¤ãã³ããéä¿¡ãããã¨ã¯ã§ãã¾ããã
ãµã¼ãã¼ããã®ã¤ãã³ãã®åä¿¡ãµã¼ãã¼éä¿¡ã¤ãã³ã API 㯠EventSource
ã¤ã³ã¿ã¼ãã§ã¤ã¹ã«å«ã¾ãã¦ãã¾ãã
EventSource
ã¤ã³ã¹ã¿ã³ã¹ã®ä½æ
ã¤ãã³ããåãåãããã«ãµã¼ãã¼ã¸ã®æ¥ç¶ãéå§ããã«ã¯ãæ°ã㪠EventSource
ãªãã¸ã§ã¯ãã使ããã¤ãã³ããçæããã¹ã¯ãªããã® URI ãæå®ãã¾ããä¾ãæãã¾ãã
const evtSource = new EventSource("ssedemo.php");
ã¤ãã³ããçæããã¹ã¯ãªãããå¥ã®ãªãªã¸ã³ã«åå¨ããå ´åã¯ã æ°ãã EventSource
ãªãã¸ã§ã¯ãã使ãã URI ã¨ãªãã·ã§ã³è¾æ¸ã®ä¸¡æ¹ãæå®ããå¿
è¦ãããã¾ããä¾ãã°ãã¯ã©ã¤ã¢ã³ãã¹ã¯ãªããã example.com
ã«ããå ´åã¯æ¬¡ã®ããã«ãªãã¾ãã
const evtSource = new EventSource("//api.example.com/ssedemo.php", {
withCredentials: true,
});
message
ã¤ãã³ãã®å¾
ã¡åã
ã¤ãã³ãã½ã¼ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ãèµ·åãããã message
ã¤ãã³ãã®ãã³ãã©ã¼ãåãä»ãã¦ããµã¼ãã¼ããã®ã¡ãã»ã¼ã¸ãå¾
ã¡åããããã¨ãã§ãã¾ãã
evtSource.onmessage = (event) => {
const newElement = document.createElement("li");
const eventList = document.getElementById("list");
newElement.textContent = `message: ${event.data}`;
eventList.appendChild(newElement);
};
ãã®ã³ã¼ãã¯å ¥åã¡ãã»ã¼ã¸ãåä¿¡ãã¦ãã¡ãã»ã¼ã¸ã®ããã¹ããææ¸ã® HTML ã«ãããªã¹ãã¸è¿½å ãã¾ãã
ã«ã¹ã¿ã ã¤ãã³ãã®å¾ ã¡åãevent
ãã£ã¼ã«ããå®ç¾©ããã¦ãããµã¼ãã¼ããã®ã¡ãã»ã¼ã¸ã¯ãevent
ã§æå®ãããååã®ã¤ãã³ãã¨ãã¦åä¿¡ããã¾ããä¾ã示ãã¾ãã
evtSource.addEventListener("ping", (event) => {
const newElement = document.createElement("li");
const eventList = document.getElementById("list");
const time = JSON.parse(event.data).time;
newElement.textContent = `ping at ${time}`;
eventList.appendChild(newElement);
});
ãã®ã³ã¼ãã¯ããµã¼ãã¼ã event
ãã£ã¼ã«ãã ping
ã«è¨å®ããã¡ãã»ã¼ã¸ãéä¿¡ãããã³ã«å¼ã³åºããã¾ãããã¡ã㯠data
ãã£ã¼ã«ãã® JSON ãè§£éãã¦ãæ
å ±ãåºåãã¾ãã
è¦å: HTTP/2 ä¸ã§ä½¿ç¨ããã¦ããªãå ´åã SSE ã¯éããã¨ãã§ããæ¥ç¶ã®æå¤§æ°ã«å¶éãåãã¾ãããã®å¶éã¯ãã©ã¦ã¶ã¼åä½ã§è¨å®ããã¦ãããé常ã«å°ããæ° (6) ã«è¨å®ããã¦ãããããè¤æ°ã®ã¿ããéãã¨ç¹ã«çã¿ãä¼´ãå ´åãããã¾ãããã®åé¡ã¯ã Chrome 㨠Firefox ã§ãä¿®æ£äºå®ãªããã¨ç¤ºããã¦ãã¾ãããã®å¶éã¯ãã©ã¦ã¶ã¼ + ãã¡ã¤ã³ãã¨ã«è¨å®ããã¦ãããwww.example1.com
ã¸ã® SSE æ¥ç¶ããã¹ã¦ã®ã¿ãã§ 6 ã¤ã www.example2.com
ã¸ã® SSE æ¥ç¶ãããã« 6 ã¤éããã¨ãã§ãããã¨ãæå³ãã¾ãï¼Stackoverflow ã«ããã°ï¼ã HTTP/2 ã使ç¨ããå ´åãåæã«ä½¿ç¨ãããã¨ãã§ãã HTTP ã¹ããªã¼ã ã®æå¤§æ°ã¯ããµã¼ãã¼ã¨ã¯ã©ã¤ã¢ã³ãã®éã§äº¤æ¸ãè¡ããã¾ãï¼æ¢å®å¤ã¯ 100 ã§ãï¼ã
ã¤ãã³ããéä¿¡ãããµã¼ãã¼å´ã®ã¹ã¯ãªããã¯ã MIME ã¿ã¤ã text/event-stream
ã§å¿çããå¿
è¦ãããã¾ããåã
ã®éç¥ã¯ã 2 ã¤ã®æ¹è¡ã§çµããããã¹ãã®ãããã¯ã¨ãã¦éä¿¡ããã¾ããã¤ãã³ãã¹ããªã¼ã ã®å½¢å¼ã«ã¤ãã¦ã詳ããã¯ã¤ãã³ãã¹ããªã¼ã å½¢å¼ãã覧ãã ããã
ãã®ä¾ã§ä½¿ç¨ãã¦ãã PHP ã¯æ¬¡ã®éãã§ãã
date_default_timezone_set("America/New_York");
header("X-Accel-Buffering: no");
header("Content-Type: text/event-stream");
header("Cache-Control: no-cache");
$counter = rand(1, 10);
while (true) {
// "ping" ã¤ãã³ããæ¯ç§éä¿¡
echo "event: ping\n";
$curDate = date(DATE_ISO8601);
echo 'data: {"time": "' . $curDate . '"}';
echo "\n\n";
// ã·ã³ãã«ãªã¡ãã»ã¼ã¸ãã©ã³ãã ãªééã§éä¿¡
$counter--;
if (!$counter) {
echo 'data: This is a message at time ' . $curDate . "\n\n";
$counter = rand(1, 10);
}
if (ob_get_contents()) {
ob_end_flush();
}
flush();
// ã¯ã©ã¤ã¢ã³ããæ¥ç¶ã䏿¢ãããï¼ãã¼ã¸ãéãããï¼ã«ã¼ãããæãã
if (connection_aborted()) break;
sleep(1);
}
ä¸è¨ã®ã³ã¼ãã¯ãã¤ãã³ã種å¥ã "ping" ã®ã¤ãã³ããæ¯ç§çæãã¾ããããããã®ã¤ãã³ãã®ãã¼ã¿ã¯ã JSON ãªãã¸ã§ã¯ãã§ãã¤ãã³ããçæãããæå»ã ISO 8601 å½¢å¼ã®ã¿ã¤ã ã¹ã¿ã³ãã§è¡¨ãã¾ããã¾ãã©ã³ãã ãªééã§ãåç´ãªã¡ãã»ã¼ã¸ï¼ã¤ãã³ã種å¥ãªãï¼ãéä¿¡ãã¾ãã ã«ã¼ãã¯æ¥ç¶ç¶æ ã«ãããããå®è¡ãç¶ãããã¾ãã®ã§ãæ¥ç¶ãéããããã¨ãï¼ä¾ãã°ã¯ã©ã¤ã¢ã³ãããã¼ã¸ãéããã¨ãï¼ã«ã«ã¼ãããè±åºããããã®ãã§ãã¯ãå«ã¾ãã¦ãã¾ãã
ã¡ã¢: ãã®è¨äºã«ããã³ã¼ãã使ç¨ããå®å ¨ãªä¾ã GitHub ã«ããã¾ãã Simple SSE demo using PHP ãåç §ãã¦ãã ããã
ã¨ã©ã¼å¦çåé¡ãçºçããå ´åï¼ãããã¯ã¼ã¯ã®ã¿ã¤ã ã¢ã¦ããã¢ã¯ã»ã¹å¶å¾¡ã«é¢ããåé¡ãªã©ï¼ã¯ãã¨ã©ã¼ã¤ãã³ããçæããã¾ãããããããã°ã©ã ã§å¦çããã«ã¯ã onerror
ã³ã¼ã«ããã¯ã EventSource
ã«å®è£
ãã¦ãã ããã
evtSource.onerror = (err) => {
console.error("EventSource failed:", err);
};
ã¤ãã³ãã¹ããªã¼ã ãéãã
æ¢å®ã§ã¯ãã¯ã©ã¤ã¢ã³ãã¨ãµã¼ãã¼ã®éã®æ¥ç¶ãéããã¨ãæ¥ç¶ãåèµ·åãã¾ããæ¥ç¶ã¯ .close()
ã¡ã½ããã§çµäºãã¾ãã
ã¤ãã³ãã¹ããªã¼ã ã¯åç´ãªããã¹ããã¼ã¿ã®ã¹ããªã¼ã ã§ã UTF-8 ã§ã¨ã³ã³ã¼ãããã¦ããªããã°ãªãã¾ãããã¤ãã³ãã¹ããªã¼ã ã®ã¡ãã»ã¼ã¸ã¯ã 2 ã¤ã®æ¹è¡æåã§åºåããã¾ããè¡ã®å é ã®æåãã³ãã³ã§ãã£ãå ´åã¯ã³ã¡ã³ãã¨ã¿ãªãããç¡è¦ããã¾ãã
ã¡ã¢: ã³ã¡ã³ãè¡ã使ç¨ãã¦ãæ¥ç¶ãã¿ã¤ã ã¢ã¦ãã«ãªããã¨ãé²ããã¨ãã§ãã¾ãããµã¼ãã¼ã¯æ¥ç¶ãç¶æããããã«ã宿çã«ã³ã¡ã³ããéä¿¡ãããã¨ãããã¾ãã
ããããã®ã¡ãã»ã¼ã¸ã¯ããã®ã¡ãã»ã¼ã¸ã®ãã£ã¼ã«ããåæãã 1 è¡ä»¥ä¸ã®ããã¹ãã§æ§æããã¦ãã¾ããåãã£ã¼ã«ãã¯ããã£ã¼ã«ãåãã³ãã³ããã®ãã£ã¼ã«ãã®å¤ã®ããã¹ããã¼ã¿ã§è¡¨ç¾ããã¾ãã
ãã£ã¼ã«ãåä¿¡ããåã¡ãã»ã¼ã¸ã«ã¯ã以ä¸ã®ãã£ã¼ã«ãã®çµã¿åãããã 1 è¡ 1 ã¤ã§ç¾ãã¾ãã
event
è¨è¿°ãããã¤ãã³ãã®ç¨®å¥ãèå¥ããæååã§ããæå®ãããå ´åãã¤ãã³ãã¯ãã©ã¦ã¶ã¼å
ã§ãæå®ãããã¤ãã³ãåã®ã¤ãã³ããªã¹ãã¼ã¸éããã¾ããã¦ã§ããµã¤ãã®ã½ã¼ã¹ã³ã¼ãã§ååä»ãã¤ãã³ããå¾
ã¡åãããã«ã¯ addEventListener()
ã使ç¨ãã¦ãã ãããã¡ãã»ã¼ã¸ã«ã¤ãã³ãåãæå®ãããªãã£ãå ´åã¯ã onmessage
ãã³ãã©ã¼ãå¼ã³åºããã¾ãã
data
ã¡ãã»ã¼ã¸ã®ãã¼ã¿ãã£ã¼ã«ãã§ãã EventSource
ã data:
ã§å§ã¾ããè¤æ°ã®é£ç¶ããè¡ãåãåã£ãã¨ãã¯ãããããé£çµãã¦åé
ç®ã®éã«æ¹è¡æåãæ¿å
¥ãã¾ããæ«å°¾ã®æ¹è¡ã¯åãé¤ããã¾ãã
id
EventSource
ãªãã¸ã§ã¯ãã®æå¾ã®ã¤ãã³ã ID ã®å¤ã«è¨å®ããã¤ãã³ã ID ã§ãã
retry
åæ¥ç¶æéã§ãããµã¼ãã¼ã¸ã®æ¥ç¶ãåããå ´åããã©ã¦ã¶ã¼ã¯æå®ããæéã ãå¾ ã£ã¦ãã忥ç¶ã試ã¿ã¾ããããã¯æ´æ°å¤ã§ãªããã°ãªãããåæ¥ç¶æéãããªç§åä½ã§æå®ãã¾ããæ´æ°å¤ä»¥å¤ãæå®ãããå ´åã¯ããã®ãã£ã¼ã«ãã¯ç¡è¦ããã¾ãã
ä»ã®ãã£ã¼ã«ãåã¯ããã¹ã¦ç¡è¦ããã¾ãã
ã¡ã¢: è¡ã«ã³ãã³ãå«ã¾ããªãå ´åã¯è¡å ¨ä½ããã£ã¼ã«ãåã¨ããå¤ã¯ç©ºæååã¨ãã¦æ±ãã¾ãã
ä¾ ãã¼ã¿ã®ã¿ã®ã¡ãã»ã¼ã¸ä»¥ä¸ã®ä¾ã§ã¯ã3 ã¤ã®ã¡ãã»ã¼ã¸ãéä¿¡ããã¦ãã¾ããæåã®ã¡ãã»ã¼ã¸ã¯ã³ãã³æåããå§ã¾ã£ã¦ãããããã³ã¡ã³ãã§ããåè¿°ããããã«ãã³ã¡ã³ãã¯ã¡ãã»ã¼ã¸ã宿çã«éä¿¡ãããªãå¯è½æ§ãããå ´åã®ãã¼ãã¢ã©ã¤ãã¨ãã¦å©ç¨ã§ãã¾ãã
2 çªç®ã®ã¡ãã»ã¼ã¸ã«ã¯ data ãã£ã¼ã«ããããããã®å¤ã¯ "some text" ã§ãã 3 çªç®ã®ã¡ãã»ã¼ã¸ã¯ data ãã£ã¼ã«ãã§ãå¤ã¯ "another message\nwith two lines" ã§ããå¤ã«æ¹è¡æåããããã¨ã«æ³¨æãã¦ãã ããã
: this is a test stream
data: some text
data: another message
data: with two lines
ååä»ãã¤ãã³ã
ãã¡ãã®ä¾ã§ã¯ãååä»ãã¤ãã³ããããã¤ãéä¿¡ãã¦ãã¾ããããããã®ã¤ãã³ãã§ã¯ã¤ãã³ãåã event
ãã£ã¼ã«ãã§æå®ããã¦ãããã¾ã data
ãã£ã¼ã«ãã§ã¯ã¯ã©ã¤ã¢ã³ãã§ã®å¦çã«å¿
è¦ãªãã¼ã¿ãå«ããé©å㪠JSON æååã®å¤ãæå®ããã¦ãã¾ãããã¡ããã data
ãã£ã¼ã«ãã«ã¯ä»»æã®æååãã¼ã¿ãå
¥ãããã¨ãã§ãã¾ãã JSON ã§ããå¿
è¦ã¯ããã¾ããã
event: userconnect
data: {"username": "bobby", "time": "02:33:48"}
event: usermessage
data: {"username": "bobby", "time": "02:34:11", "text": "Hi everyone."}
event: userdisconnect
data: {"username": "bobby", "time": "02:34:23"}
event: usermessage
data: {"username": "sean", "time": "02:34:36", "text": "Bye, bobby."}
çµã¿åãã
ååãªãã®ã¡ãã»ã¼ã¸ã種é¡ã®ä»ããã¤ãã³ãã ãã使ç¨ããªããã°ãªããªã訳ã§ã¯ããã¾ãããããããåä¸ã®ã¤ãã³ãã¹ããªã¼ã å ã§æ··ç¨ãããã¨ãã§ãã¾ãã
event: userconnect
data: {"username": "bobby", "time": "02:33:48"}
data: Here's a system message of some kind that will get used
data: to accomplish some task.
event: usermessage
data: {"username": "bobby", "time": "02:34:11", "text": "Hi everyone."}
ãã©ã¦ã¶ã¼ã®äºææ§
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4