Long-Polling, Websockets, Server-Sent Events (SSE) và Comet là gì?


1048

Tôi đã thử đọc một số bài báo, nhưng tôi không rõ lắm về các khái niệm này.

Ai đó muốn chụp ảnh giải thích cho tôi những công nghệ này là gì:

  1. Bỏ phiếu dài
  2. Sự kiện gửi máy chủ
  3. Websockets
  4. Sao chổi

Một điều mà tôi gặp phải mỗi lần là, máy chủ giữ kết nối mở và đẩy dữ liệu đến máy khách. Làm thế nào để kết nối được mở và khách hàng có được dữ liệu đẩy như thế nào? (Làm thế nào để khách hàng sử dụng dữ liệu, có thể một số mã có thể giúp đỡ?)

Bây giờ, một trong số chúng tôi nên sử dụng cho một ứng dụng thời gian thực. Tôi đã nghe rất nhiều về websockets (với socket.io [thư viện node.js]) nhưng tại sao không phải là PHP?


1
Websocket thời gian thực hoặc webrtc? Có một thư viện cho websocket bằng php, bạn không cần phải viết thêm mã để nó hoạt động bằng ZMQ hoặc chỉ lập trình socket, nodeJs được xây dựng để nó dễ dàng có sẵn. Lý do websocket không có sẵn trong php là bạn phải chạy thêm một thiết bị đầu cuối và giữ cho nó chạy để máy chủ websocket có sẵn, bạn sẽ có hai máy chủ. và cấu trúc, php không phải là cấu trúc sự kiện như javascript, do đó, websocket sử dụng cấu trúc sự kiện để bắt và gửi tin nhắn.
PauAI

Ngoài ra: Sự kiện Comet và ServerSent là giải pháp của PHP để đạt được gần như thời gian thực (không thực sự) mà không cần tạo 2 máy chủ.
PauAI

Câu trả lời:


2077

Trong các ví dụ bên dưới, máy khách là trình duyệt và máy chủ là máy chủ web lưu trữ trang web.

Trước khi bạn có thể hiểu các công nghệ này, trước tiên bạn phải hiểu lưu lượng truy cập web HTTP cổ điển .

HTTP thông thường:

  1. Một khách hàng yêu cầu một trang web từ một máy chủ.
  2. Máy chủ tính toán phản hồi
  3. Máy chủ gửi phản hồi cho khách hàng.

HTTP

Bỏ phiếu Ajax:

  1. Một khách hàng yêu cầu một trang web từ một máy chủ sử dụng HTTP thông thường (xem HTTP ở trên).
  2. Máy khách nhận được trang web được yêu cầu và thực thi JavaScript trên trang yêu cầu tệp từ máy chủ theo định kỳ (ví dụ 0,5 giây).
  3. Máy chủ tính toán từng phản hồi và gửi lại, giống như lưu lượng HTTP thông thường.

Bỏ phiếu Ajax

Ajax bỏ phiếu dài:

  1. Một khách hàng yêu cầu một trang web từ một máy chủ sử dụng HTTP thông thường (xem HTTP ở trên).
  2. Máy khách nhận được trang web được yêu cầu và thực thi JavaScript trên trang yêu cầu tệp từ máy chủ.
  3. Máy chủ không phản hồi ngay lập tức với thông tin được yêu cầu mà đợi cho đến khi có thông tin mới .
  4. Khi có thông tin mới, máy chủ sẽ phản hồi với thông tin mới.
  5. Máy khách nhận được thông tin mới và ngay lập tức gửi yêu cầu khác đến máy chủ, bắt đầu lại quy trình.

Ajax bỏ phiếu dài

Sự kiện đã gửi máy chủ HTML5 (SSE) / EventSource:

  1. Một khách hàng yêu cầu một trang web từ một máy chủ sử dụng HTTP thông thường (xem HTTP ở trên).
  2. Máy khách nhận được trang web được yêu cầu và thực thi JavaScript trên trang mở kết nối đến máy chủ.
  3. Máy chủ sẽ gửi một sự kiện đến máy khách khi có thông tin mới.

    • Lưu lượng truy cập thời gian thực từ máy chủ đến máy khách, chủ yếu là những gì bạn sẽ cần
    • Bạn sẽ muốn sử dụng máy chủ có vòng lặp sự kiện
    • Chỉ có thể kết nối với máy chủ từ các miền khác với cài đặt CORS chính xác
    • Nếu bạn muốn đọc thêm, tôi thấy những điều này rất hữu ích: (bài viết) , (bài viết) , (bài viết) , (hướng dẫn) .

HTML5 SSE

Ổ cắm web HTML5:

  1. Một khách hàng yêu cầu một trang web từ một máy chủ sử dụng http thông thường (xem HTTP ở trên).
  2. Máy khách nhận được trang web được yêu cầu và thực thi JavaScript trên trang mở kết nối với máy chủ.
  3. Máy chủ và máy khách hiện có thể gửi tin nhắn cho nhau khi có dữ liệu mới (ở hai bên).

    • Lưu lượng thời gian thực từ máy chủ đến máy khách từ máy khách đến máy chủ
    • Bạn sẽ muốn sử dụng máy chủ có vòng lặp sự kiện
    • Với WebSockets, có thể kết nối với máy chủ từ một tên miền khác.
    • Nó cũng có thể sử dụng một máy chủ lưu trữ WebSocket của bên thứ ba, ví dụ Pusher hoặc người khác . Bằng cách này, bạn sẽ chỉ phải thực hiện phía khách hàng, rất dễ dàng!
    • Nếu bạn muốn đọc thêm, tôi thấy những điều này rất hữu ích: ( bài viết ), (bài viết) ( hướng dẫn ).

Ổ cắm web HTML5

Sao chổi:

Comet là tập hợp các kỹ thuật trước HTML5, sử dụng phát trực tuyến và bỏ phiếu dài để đạt được các ứng dụng thời gian thực. Tìm hiểu thêm về wikipedia hay này bài viết.


Bây giờ, một trong số chúng tôi nên sử dụng cho một ứng dụng thời gian thực (mà tôi cần mã hóa). Tôi đã nghe nhiều về websockets (với socket.io [thư viện node.js]) nhưng tại sao không phải là PHP?

Bạn có thể sử dụng PHP với WebSockets, hãy xem Ratchet .


21
Điều này thật tuyệt! Tôi đang đọc SSE và thấy bài viết này, nó rất hay - như bây giờ tôi đã so sánh các thứ, bạn cũng có thể đưa SSE vào đây để chúng tôi cũng có thể kiểm tra chéo sự khác biệt của nó với Websocket không?
chỉ số

1
@Tieme ơi là vậy à? Tôi nghĩ SSE có nghĩa là Sự kiện gửi máy chủ. Dù sao, cảm ơn, tôi thấy nó bây giờ.
chỉ số

1
Hỏi: trong php, giả sử bạn đang sử dụng websocket, mọi khách hàng được kết nối với máy chủ của tôi bằng ws: sẽ có một luồng được phân bổ cho anh ấy / cô ấy và kích thước của nó sẽ là ~ 2mb như trường hợp với các yêu cầu thông thường? Làm thế nào mà khác nhau trong nodejs? Có bao nhiêu máy khách đồng thời có thể xử lý nodejs và khi nó phá vỡ những gì xảy ra?
Muhammad Umer

5
Bạn có thể thực hiện tương tự với cả hai giải pháp nhưng cơ chế là khác nhau. Bỏ phiếu dài sử dụng dữ liệu http 'thông thường', SSE sử dụng giao thức cơ bản khác và cần thiết lập máy chủ khác so với bỏ phiếu dài.
Tieme

2
Vâng, bạn có thể sử dụng apache nếu bạn muốn. Nhưng rất nhiều người sử dụng Node.js vì nó có vòng lặp sự kiện. Nhưng đối với Apache, hãy xem stackoverflow.com/questions/12203443/ từ
Tieme

37

Tieme đã nỗ lực rất nhiều vào câu trả lời xuất sắc của mình, nhưng tôi nghĩ cốt lõi của câu hỏi OP là các công nghệ này liên quan đến PHP như thế nào chứ không phải mỗi công nghệ hoạt động như thế nào.

PHP là ngôn ngữ được sử dụng nhiều nhất trong phát triển web bên cạnh html, css và javascript phía máy khách rõ ràng. Tuy nhiên, PHP có 2 vấn đề lớn khi nói đến các ứng dụng thời gian thực:

1) PHP bắt đầu như một CGI rất cơ bản. PHP đã tiến bộ rất xa kể từ giai đoạn đầu, nhưng nó đã xảy ra trong các bước nhỏ. PHP đã có nhiều triệu người dùng vào thời điểm đó, nó đã trở thành thư viện C có thể nhúng và linh hoạt như ngày nay, hầu hết họ đều phụ thuộc vào mô hình thực thi trước đó, vì vậy nó đã không nỗ lực để thoát khỏi mô hình cgi nội bộ. Ngay cả giao diện dòng lệnh cũng gọi thư viện PHP (libphp5.so trên linux, php5ts.dll trên windows, v.v.) như thể nó vẫn là một cgi xử lý yêu cầu GET / POST. Nó vẫn thực thi mã như thể nó chỉ phải xây dựng một "trang" và sau đó kết thúc vòng đời của nó. Kết quả là, nó có rất ít hỗ trợ cho lập trình đa luồng hoặc lập trình hướng sự kiện (trong không gian người dùng PHP), khiến nó hiện không thực tế cho các ứng dụng đa người dùng, thời gian thực.

Lưu ý rằng PHP không có các phần mở rộng để cung cấp các vòng lặp sự kiện (chẳng hạn như libevent) và các luồng (như pthreads) trong không gian người dùng PHP, nhưng rất, rất, rất ít ứng dụng sử dụng chúng.

2) PHP vẫn có vấn đề quan trọng với bộ sưu tập rác. Mặc dù các vấn đề này đã được cải thiện một cách nhất quán (có thể là bước lớn nhất để kết thúc vòng đời như được mô tả ở trên), ngay cả những nỗ lực tốt nhất để tạo các ứng dụng PHP chạy dài đòi hỏi phải được khởi động lại một cách thường xuyên. Điều này cũng làm cho nó không thực tế cho các ứng dụng thời gian thực.

PHP 7 sẽ là một bước tuyệt vời để khắc phục những vấn đề này và dường như rất hứa hẹn là một nền tảng cho các ứng dụng thời gian thực.


2
Một điều chỉnh nhỏ: PHP luôn được viết bằng C, như có thể thấy ở đây: Museum.php.net/php1 Ngoài ra, "ít sử dụng hơn (nhưng phổ biến hơn nhiều)" khá mâu thuẫn; có lẽ những gì bạn có nghĩa là "thời trang hơn"?
IMSoP

@IMSoP - Cảm ơn bạn đã sửa lỗi, tôi đã sử dụng PHP trong hơn một thập kỷ và luôn có ấn tượng rằng nó bắt nguồn từ Perl. Trang lịch sử PHP rõ ràng cũng hỗ trợ rằng ban đầu nó cũng là C. Tôi sẽ chỉnh sửa câu trả lời của mình khi tôi tìm thấy một khoảnh khắc.
JSON

Tôi sẽ xóa một chút về Perl vì nó không kết hợp tốt với tài liệu chính thức, nhưng đây vẫn là một lĩnh vực khó hiểu trong quá trình phát triển ban đầu của PHP.
JSON

PHP 7 có vẻ rất hứa hẹn là một nền tảng cho các ứng dụng thời gian thực? Những cải tiến / thay đổi trong PHP7 cho các ứng dụng thời gian thực?
Tôi sẽ trở lại


9

Tôi đã cố gắng ghi chú về những điều này và đã thu thập và viết các ví dụ từ quan điểm java .

HTTP dành cho nhà phát triển Java

Reverse Ajax - Kiểu cũ

Xử lý Async ở phía máy chủ

Reverse Ajax - Phong cách mới

Sự kiện máy chủ đã gửi

Đặt nó ở đây cho bất kỳ nhà phát triển java nào đang tìm kiếm cùng một chủ đề.


hầu hết các trang web này không hoạt động!
Alexander Dunn

@AlexanderDunn cảm ơn bạn đã đưa nó lên. Tôi sẽ sửa nó với các liên kết được cập nhật
John

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.