Apa itu Polling Panjang, Websockets, Server-Sent Events (SSE) dan Comet?

1048

Saya sudah mencoba membaca beberapa artikel, tetapi saya belum begitu mengerti konsepnya.

Apakah ada orang yang ingin menjelaskan kepada saya apa teknologi ini:

  1. Polling Panjang
  2. Acara yang Dikirim Server
  3. Soket web
  4. Komet

Satu hal yang saya temui setiap kali adalah, server membuat koneksi tetap terbuka dan mendorong data ke klien. Bagaimana koneksi tetap terbuka, dan bagaimana klien mendapatkan data yang didorong? (Bagaimana klien menggunakan data, mungkin beberapa kode mungkin membantu?)

Sekarang, yang mana yang harus saya gunakan untuk aplikasi waktu nyata. Saya telah mendengar banyak tentang soket web (dengan socket.io [perpustakaan node.js]) tetapi mengapa tidak PHP?

pengguna1437328
sumber
1
Websocket atau webrtc waktu nyata? Ada perpustakaan untuk websocket di php, Anda perlu menulis kode tambahan agar dapat bekerja menggunakan ZMQ atau hanya pemrograman soket, nodeJs dibangun untuk ini sehingga mudah tersedia. Alasan websocket tidak tersedia di php adalah bahwa Anda harus menjalankan terminal tambahan dan menjaganya tetap berjalan sehingga server websocket sudah tersedia, Anda akan memiliki dua server. dan strukturnya, php bukan struktur acara seperti javascript jadi begitulah, websocket menggunakan struktur acara untuk menangkap dan mengirim pesan.
PauAI
Selain itu: Acara Comet dan ServerSent adalah solusi PHP untuk mencapai hampir realtime (tidak benar-benar) tanpa membuat 2 server.
PauAI

Jawaban:

2077

Dalam contoh di bawah ini, klien adalah browser dan server adalah server web yang menampung situs web.

Sebelum Anda dapat memahami teknologi ini, Anda harus memahami lalu lintas web HTTP klasik terlebih dahulu.

HTTP reguler:

  1. Klien meminta halaman web dari server.
  2. Server menghitung respons
  3. Server mengirimkan respons ke klien.

HTTP

Ajax Polling:

  1. Seorang klien meminta halaman web dari server menggunakan HTTP biasa (lihat HTTP di atas).
  2. Klien menerima halaman web yang diminta dan menjalankan JavaScript pada halaman yang meminta file dari server secara berkala (mis. 0,5 detik).
  3. Server menghitung setiap respons dan mengirimkannya kembali, sama seperti lalu lintas HTTP normal.

Polling Ajax

Ajax Polling Panjang:

  1. Seorang klien meminta halaman web dari server menggunakan HTTP biasa (lihat HTTP di atas).
  2. Klien menerima halaman web yang diminta dan menjalankan JavaScript pada halaman yang meminta file dari server.
  3. Server tidak segera merespons dengan informasi yang diminta tetapi menunggu sampai ada informasi baru yang tersedia.
  4. Ketika ada informasi baru yang tersedia, server merespons dengan informasi baru.
  5. Klien menerima informasi baru dan segera mengirimkan permintaan lain ke server, memulai kembali proses.

Ajax Polling Panjang

Server Terkirim Acara HTML5 (SSE) / EventSource:

  1. Seorang klien meminta halaman web dari server menggunakan HTTP biasa (lihat HTTP di atas).
  2. Klien menerima halaman web yang diminta dan menjalankan JavaScript pada halaman yang membuka koneksi ke server.
  3. Server mengirim acara ke klien ketika ada informasi baru yang tersedia.

    • Lalu lintas waktu-nyata dari server ke klien, sebagian besar itulah yang Anda perlukan
    • Anda ingin menggunakan server yang memiliki loop acara
    • Koneksi dengan server dari domain lain hanya dimungkinkan dengan pengaturan CORS yang benar
    • Jika Anda ingin membaca lebih lanjut, saya menemukan ini sangat berguna: (artikel) , (artikel) , (artikel) , (tutorial) .

HTML5 SSE

HTML5 Websockets:

  1. Seorang klien meminta halaman web dari server menggunakan http biasa (lihat HTTP di atas).
  2. Klien menerima halaman web yang diminta dan menjalankan JavaScript pada halaman yang membuka koneksi dengan server.
  3. Server dan klien sekarang dapat saling mengirim pesan ketika data baru (di kedua sisi) tersedia.

    • Lalu lintas waktu-nyata dari server ke klien dan dari klien ke server
    • Anda ingin menggunakan server yang memiliki loop acara
    • Dengan WebSockets, Anda dapat terhubung dengan server dari domain lain.
    • Dimungkinkan juga untuk menggunakan server websocket pihak ketiga yang dihosting, misalnya Pusher atau lainnya . Dengan cara ini Anda hanya perlu mengimplementasikan sisi klien, yang sangat mudah!
    • Jika Anda ingin membaca lebih lanjut, saya menemukan ini sangat berguna: ( artikel ), (artikel) ( tutorial ).

WebSockets HTML5

Komet:

Comet adalah kumpulan teknik sebelum HTML5 yang menggunakan streaming dan polling panjang untuk mencapai aplikasi waktu nyata. Baca lebih lanjut di wikipedia atau artikel ini .


Sekarang, yang mana yang harus saya gunakan untuk aplikasi waktu nyata (yang perlu saya kode). Saya telah mendengar banyak tentang soket web (dengan socket.io [perpustakaan node.js]) tetapi mengapa tidak PHP?

Anda dapat menggunakan PHP dengan WebSockets, periksa Ratchet .

Ikat aku
sumber
21
Ini luar biasa! Saya membaca tentang SSE dan menemukan artikel ini, sangat bagus - seperti saya sekarang membandingkan barang, dapatkah Anda juga memasukkan SSE di sini sehingga kami juga dapat memeriksa silang perbedaannya dengan Websocket?
indeks
1
@Tieme Oh apakah itu? Saya pikir SSE berarti Server-Sent Events. Bagaimanapun, terima kasih, saya melihatnya sekarang.
indeks
1
T: di php katakanlah Anda menggunakan websocket apakah setiap klien terhubung ke server saya menggunakan ws: apakah ada satu utas yang dialokasikan untuknya dan ukurannya akan ~ 2mb seperti halnya dengan permintaan normal? bagaimana perbedaan dalam nodejs? Berapa banyak klien konkuren yang dapat menangani dan ketika putus apa yang terjadi?
Muhammad Umer
5
Anda dapat melakukan hal yang sama dengan kedua solusi tetapi mekanismenya berbeda. Polling panjang menggunakan data http 'reguler', SSE menggunakan protokol dasar yang berbeda dan membutuhkan pengaturan server yang berbeda dibandingkan dengan polling panjang.
Tieme
2
Yah, Anda bisa menggunakan apache jika mau. Tetapi banyak orang menggunakan Node.js karena memiliki loop acara. Tetapi untuk Apache, lihat stackoverflow.com/questions/12203443/…
Tieme
37

Tieme berusaha keras untuk menjawabnya dengan sangat baik, tapi saya pikir inti dari pertanyaan OP adalah bagaimana teknologi ini berhubungan dengan PHP daripada bagaimana masing-masing teknologi bekerja.

PHP adalah bahasa yang paling banyak digunakan dalam pengembangan web selain sisi klien yang jelas html, css, dan javascript. Namun PHP memiliki 2 masalah utama dalam hal aplikasi waktu nyata:

1) PHP dimulai sebagai CGI yang sangat mendasar. PHP telah berkembang sangat jauh sejak tahap awal, tetapi terjadi dalam langkah-langkah kecil. PHP sudah memiliki jutaan pengguna pada saat itu menjadi pustaka C yang fleksibel yang dapat diembed dan fleksibel seperti sekarang ini, yang sebagian besar bergantung pada model eksekusi sebelumnya, sehingga belum membuat upaya yang solid untuk melarikan diri dari model cgi secara internal. Bahkan antarmuka commandline memanggil perpustakaan PHP (libphp5.so di linux, php5ts.dll di windows, dll) seolah-olah masih cgi yang memproses permintaan GET / POST. Itu masih mengeksekusi kode seolah-olah itu hanya harus membangun "halaman" dan kemudian mengakhiri siklus hidup itu. Sebagai hasilnya, ia hanya memiliki sedikit dukungan untuk pemrograman multi-thread atau event-driven (dalam ruang pengguna PHP), menjadikannya saat ini tidak taktis untuk aplikasi multi-pengguna waktu nyata.

Perhatikan bahwa PHP memang memiliki ekstensi untuk menyediakan loop acara (seperti libevent) dan utas (seperti pthreads) di ruang pengguna PHP, tetapi sangat, sangat, sangat sedikit aplikasi yang menggunakan ini.

2) PHP masih memiliki masalah signifikan dengan pengumpulan sampah. Meskipun masalah-masalah ini telah secara konsisten membaik (kemungkinan itu adalah langkah terbesar untuk mengakhiri siklus hidup seperti yang dijelaskan di atas), bahkan upaya terbaik untuk membuat aplikasi PHP yang berjalan lama perlu dimulai kembali secara teratur. Ini juga membuatnya tidak taktis untuk aplikasi waktu nyata.

PHP 7 akan menjadi langkah yang bagus untuk memperbaiki masalah ini juga, dan tampaknya sangat menjanjikan sebagai platform untuk aplikasi real-time.

JSON
sumber
2
Satu koreksi kecil: PHP selalu ditulis dalam C, seperti yang bisa dilihat di sini: museum.php.net/php1 Juga, "lebih sedikit digunakan (tapi jauh lebih populer)" agak kontradiktif dengan diri sendiri; mungkin yang Anda maksud adalah "lebih modis"?
IMSoP
@IMSoP - Terima kasih atas koreksinya, saya telah menggunakan PHP selama lebih dari satu dekade dan selalu mendapat kesan bahwa akarnya ada di Perl. Halaman sejarah PHP jelas mendukung bahwa itu awalnya C juga. Saya akan mengedit jawaban saya setelah saya menemukan momen.
JSON
Saya akan menghapus sedikit tentang Perl karena tidak cocok dengan dokumentasi resmi, tetapi ini masih merupakan area yang membingungkan dalam pengembangan awal PHP.
JSON
PHP 7 tampaknya sangat menjanjikan sebagai platform untuk aplikasi real-time? Apa perbaikan / perubahan dalam PHP7 untuk aplikasi real-time?
I'll-Be-Back
1

Anda dapat dengan mudah menggunakan Node.JS di aplikasi web Anda hanya untuk komunikasi waktu nyata. Node.JS sangat kuat ketika ini tentang WebSockets. Oleh karena itu "Pemberitahuan PHP via Node.js" akan menjadi konsep yang hebat.

Lihat contoh ini: Membuat Aplikasi Obrolan Real-Time dengan PHP dan Node.js

Supun Kavinda
sumber