Tất cả,
HTML5 Rocks có một hướng dẫn dành cho người mới bắt đầu về Sự kiện do máy chủ gửi (SSE):
http://www.html5rocks.com/en/tutorials/eventsource/basics/
Tuy nhiên, tôi không hiểu một khái niệm quan trọng - điều gì kích hoạt sự kiện trên máy chủ khiến thư được gửi?
Nói cách khác - trong ví dụ HTML5 - máy chủ chỉ gửi một dấu thời gian một lần :
<?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()));
Nếu tôi đang xây dựng một ví dụ thực tế - ví dụ: "bức tường" kiểu Facebook hoặc mã cổ phiếu, trong đó máy chủ sẽ "đẩy" một thông báo mới đến máy khách mỗi khi một số phần dữ liệu thay đổi, thì điều đó hoạt động như thế nào?
Nói cách khác ... Tập lệnh PHP có một vòng lặp chạy liên tục, kiểm tra sự thay đổi trong dữ liệu, sau đó gửi thông báo mỗi khi nó tìm thấy một vòng lặp? Nếu vậy - làm thế nào để bạn biết khi nào kết thúc quá trình đó?
Hoặc - tập lệnh PHP có đơn giản chỉ gửi tin nhắn, sau đó kết thúc (như trường hợp trong ví dụ HTML5Rocks)? Nếu vậy - làm cách nào để bạn nhận được các bản cập nhật liên tục? Trình duyệt chỉ đơn giản là thăm dò trang PHP theo định kỳ? Nếu vậy - đó là "sự kiện do máy chủ gửi" như thế nào? Điều này khác với việc viết hàm setInterval trong JavaScript sử dụng AJAX để gọi một trang PHP như thế nào?
Xin lỗi - đây có lẽ là một câu hỏi cực kỳ ngây thơ. Nhưng không có ví dụ nào tôi có thể tìm thấy làm rõ điều này.
[CẬP NHẬT]
Tôi nghĩ rằng câu hỏi của tôi được diễn đạt kém, vì vậy đây là một số giải thích rõ ràng.
Giả sử tôi có một trang web hiển thị giá gần đây nhất của cổ phiếu Apple.
Khi người dùng mở trang lần đầu, trang sẽ tạo EventSource với URL của "luồng" của tôi.
var source = new EventSource('stream.php');
Câu hỏi của tôi là - "stream.php" nên hoạt động như thế nào?
Như thế này? (mã giả):
<?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
}
?>
Nói cách khác - "stream.php" có mở miễn là máy khách "kết nối" với nó không?
Nếu vậy - điều đó có nghĩa là bạn có bao nhiêu luồng chạy stream.php
như bạn có người dùng đồng thời? Nếu vậy - điều đó có khả thi từ xa hay là một cách thích hợp để xây dựng một ứng dụng? Và làm thế nào để bạn biết khi nào bạn có thể KẾT THÚC một phiên bản stream.php
?
Ấn tượng ngây thơ của tôi là, nếu đúng như vậy, PHP không phải là một công nghệ phù hợp cho loại máy chủ này. Nhưng tất cả các bản demo mà tôi đã xem cho đến nay đều ngụ ý rằng PHP rất tốt cho việc này, đó là lý do tại sao tôi rất bối rối ...