ทั้งหมด,
HTML5 Rocks มีบทช่วยสอนสำหรับผู้เริ่มต้นที่ดีเกี่ยวกับเหตุการณ์ที่เซิร์ฟเวอร์ส่ง (SSE):
http://www.html5rocks.com/en/tutorials/eventsource/basics/
แต่ฉันไม่เข้าใจแนวคิดที่สำคัญ - อะไรเป็นตัวกระตุ้นให้เกิดเหตุการณ์บนเซิร์ฟเวอร์ที่ทำให้ส่งข้อความ
กล่าวอีกนัยหนึ่ง - ในตัวอย่าง HTML5 เซิร์ฟเวอร์จะส่งการประทับเวลาเพียงครั้งเดียว :
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache'); // recommended to prevent caching of event data.
function sendMsg($id, $msg) {
echo "id: $id" . PHP_EOL;
echo "data: $msg" . PHP_EOL;
echo PHP_EOL;
ob_flush();
flush();
}
$serverTime = time();
sendMsg($serverTime, 'server time: ' . date("h:i:s", time()));
หากฉันกำลังสร้างตัวอย่างที่ใช้ได้จริงเช่น "กำแพง" แบบ Facebook หรือสัญลักษณ์หุ้นซึ่งเซิร์ฟเวอร์จะ "ส่ง" ข้อความใหม่ไปยังลูกค้าทุกครั้งที่มีการเปลี่ยนแปลงข้อมูลบางส่วนจะทำงานอย่างไร
กล่าวอีกนัยหนึ่ง ... สคริปต์ PHP มีลูปที่ทำงานอย่างต่อเนื่องตรวจสอบการเปลี่ยนแปลงข้อมูลจากนั้นส่งข้อความทุกครั้งที่พบหรือไม่? ถ้าเป็นเช่นนั้นคุณจะรู้ได้อย่างไรว่าเมื่อใดควรสิ้นสุดกระบวนการนั้น
หรือ - สคริปต์ PHP เพียงแค่ส่งข้อความจากนั้นก็สิ้นสุด (ตามที่ปรากฏในตัวอย่าง HTML5Rocks) ถ้าเป็นเช่นนั้นคุณจะได้รับการอัปเดตอย่างต่อเนื่องได้อย่างไร เบราว์เซอร์เป็นเพียงการสำรวจหน้า PHP ในช่วงเวลาปกติหรือไม่? ถ้าเป็นเช่นนั้น "เหตุการณ์ที่เซิร์ฟเวอร์ส่ง" เป็นอย่างไร สิ่งนี้แตกต่างจากการเขียนฟังก์ชัน setInterval ใน JavaScript ที่ใช้ AJAX เพื่อเรียกหน้า PHP ในช่วงเวลาปกติอย่างไร
ขอโทษ - นี่อาจเป็นคำถามที่ไร้เดียงสาอย่างไม่น่าเชื่อ แต่ไม่มีตัวอย่างใดที่ฉันสามารถหาได้ทำให้ชัดเจน
[อัปเดต]
ฉันคิดว่าคำถามของฉันใช้คำไม่ดีดังนั้นนี่คือคำชี้แจงบางส่วน
สมมติว่าฉันมีหน้าเว็บที่ควรแสดงราคาล่าสุดของหุ้นของ Apple
เมื่อผู้ใช้เปิดหน้าครั้งแรกหน้าจะสร้าง EventSource โดยใช้ URL ของ "stream" ของฉัน
var source = new EventSource('stream.php');
คำถามของฉันคือ "stream.php" ควรทำงานอย่างไร
แบบนี้? (รหัสหลอก):
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache'); // recommended to prevent caching of event data.
function sendMsg($msg) {
echo "data: $msg" . PHP_EOL;
echo PHP_EOL;
flush();
}
while (some condition) {
// check whether Apple's stock price has changed
// e.g., by querying a database, or calling a web service
// if it HAS changed, sendMsg with new price to client
// otherwise, do nothing (until next loop)
sleep (n) // wait n seconds until checking again
}
?>
กล่าวอีกนัยหนึ่ง - "stream.php" จะยังคงเปิดอยู่ตราบเท่าที่ไคลเอนต์ "เชื่อมต่อ" กับมันหรือไม่
ถ้าเป็นเช่นนั้นหมายความว่าคุณมีเธรดจำนวนมากstream.php
เท่าที่คุณมีผู้ใช้พร้อมกันหรือไม่? ถ้าเป็นเช่นนั้น - เป็นไปได้จากระยะไกลหรือเป็นวิธีที่เหมาะสมในการสร้างแอปพลิเคชัน? และคุณจะรู้ได้อย่างไรว่าคุณสามารถยุติอินสแตนซ์ได้เมื่อstream.php
ใด
ความประทับใจที่ไร้เดียงสาของฉันคือถ้าเป็นกรณีนี้ PHP ไม่ใช่เทคโนโลยีที่เหมาะสมสำหรับเซิร์ฟเวอร์ประเภทนี้ แต่การสาธิตทั้งหมดที่ฉันได้เห็นบ่งบอกว่า PHP นั้นใช้ได้ดีสำหรับสิ่งนี้ซึ่งเป็นสาเหตุที่ทำให้ฉันสับสน ...