Cara Facebook melakukan ini cukup menarik.
Metode umum untuk melakukan pemberitahuan semacam itu adalah dengan menyurvei skrip di server (menggunakan AJAX) pada interval tertentu (mungkin setiap beberapa detik), untuk memeriksa apakah sesuatu telah terjadi. Namun, ini bisa sangat intensif jaringan, dan Anda sering membuat permintaan yang tidak berguna, karena tidak ada yang terjadi.
Cara Facebook melakukannya menggunakan pendekatan komet, alih-alih polling pada suatu interval, begitu satu polling selesai, ia mengeluarkan yang lain. Namun, setiap permintaan ke skrip di server memiliki batas waktu yang sangat lama, dan server hanya menanggapi permintaan setelah sesuatu terjadi. Anda dapat melihat ini terjadi jika Anda membuka tab Firebug's Console saat berada di Facebook, dengan permintaan untuk skrip mungkin memerlukan waktu beberapa menit. Benar-benar cerdik, karena metode ini langsung mengurangi jumlah permintaan, dan seberapa sering Anda harus mengirimnya. Anda sekarang secara efektif memiliki kerangka acara yang memungkinkan server untuk 'memecat' acara.
Di balik ini, dalam hal konten aktual yang dikembalikan dari jajak pendapat itu, itu adalah respons JSON, dengan apa yang tampak sebagai daftar acara, dan info tentangnya. Ini diperkecil, jadi agak sulit dibaca.
Dalam hal teknologi aktual, AJAX adalah cara untuk pergi ke sini, karena Anda dapat mengontrol batas waktu permintaan, dan banyak hal lainnya. Saya akan merekomendasikan (Stack overflow klise di sini) menggunakan jQuery untuk melakukan AJAX, itu akan mengambil banyak masalah lintas-kompabilitas. Dalam hal PHP, Anda hanya bisa polling tabel database log peristiwa dalam skrip PHP Anda, dan hanya kembali ke klien ketika sesuatu terjadi? Saya berharap ada banyak cara untuk mengimplementasikan ini.
Menerapkan:
Sisi server:
Tampaknya ada beberapa implementasi pustaka komet di PHP, tetapi jujur saja, itu sangat sederhana, sesuatu yang mungkin seperti kodesemu berikut:
while(!has_event_happened()) {
sleep(5);
}
echo json_encode(get_events());
Fungsi has_event_happened hanya akan memeriksa jika ada sesuatu yang terjadi di tabel acara atau sesuatu, dan kemudian fungsi get_events akan mengembalikan daftar baris baru di tabel? Tergantung pada konteks masalah sebenarnya.
Jangan lupa untuk mengubah waktu eksekusi PHP max Anda, jika tidak maka akan habis lebih awal!
Sisi klien:
Lihatlah plugin jQuery untuk melakukan interaksi Comet:
Yang mengatakan, plugin tampaknya menambah sedikit kompleksitas, sebenarnya sangat sederhana pada klien, mungkin (dengan jQuery) sesuatu seperti:
function doPoll() {
$.get("events.php", {}, function(result) {
$.each(result.events, function(event) { //iterate over the events
//do something with your event
});
doPoll();
//this effectively causes the poll to run again as
//soon as the response comes back
}, 'json');
}
$(document).ready(function() {
$.ajaxSetup({
timeout: 1000*60//set a global AJAX timeout of a minute
});
doPoll(); // do the first poll
});
Semuanya sangat tergantung pada bagaimana arsitektur yang ada disatukan.
Memperbarui
Ketika saya terus menerima upvotes tentang ini, saya pikir masuk akal untuk mengingat bahwa jawaban ini adalah 4 tahun. Web telah berkembang dengan sangat cepat, jadi harap perhatikan jawaban ini.
Saya memiliki masalah yang sama baru-baru ini dan meneliti tentang masalah ini.
Solusi yang diberikan disebut polling panjang, dan untuk menggunakannya dengan benar, Anda harus yakin bahwa permintaan AJAX Anda memiliki batas waktu "besar" dan untuk selalu membuat permintaan ini setelah akhir saat ini (batas waktu, kesalahan atau kesuksesan).
Polling Panjang - Klien
Di sini, untuk menjaga agar kode tetap pendek, saya akan menggunakan jQuery:
Penting untuk diingat bahwa (dari jQuery docs ):
Polling Panjang - Server
Itu tidak dalam bahasa tertentu, tetapi akan menjadi sesuatu seperti ini:
Di sini,
hasTimedOut
akan memastikan kode Anda tidak menunggu selamanya, dananythingHappened
, akan memeriksa apakah ada peristiwa yang terjadi. Thesleep
adalah untuk melepaskan thread Anda untuk melakukan hal-hal lain sementara tidak ada yang terjadi. Theevents
akan kembali kamus peristiwa (atau struktur data lainnya Anda dapat memilih) dalam format JSON (atau lainnya yang Anda suka).Itu pasti memecahkan masalah, tetapi, jika Anda khawatir tentang skalabilitas dan kinerja seperti ketika saya meneliti, Anda mungkin mempertimbangkan solusi lain yang saya temukan.
Larutan
Gunakan soket!
Di sisi klien, untuk menghindari masalah kompatibilitas, gunakan socket.io . Mencoba menggunakan soket secara langsung, dan memiliki solusi fallbacks untuk solusi lain ketika soket tidak tersedia.
Di sisi server, buat server menggunakan NodeJS (contoh di sini ). Klien akan berlangganan saluran ini (pengamat) yang dibuat dengan server. Setiap kali pemberitahuan harus dikirim, itu diterbitkan di saluran ini dan pelanggan (klien) akan diberi tahu.
Jika Anda tidak menyukai solusi ini, coba APE ( Ajax Push Engine ).
Semoga saya bisa membantu.
sumber
hasTimedOut()
?Menurut tayangan slide tentang sistem Messaging Facebook, Facebook menggunakan teknologi komet untuk "mendorong" pesan ke browser web. Server komet Facebook dibangun di server web Erlang bersumber terbuka mochiweb.
Pada gambar di bawah, frasa "saluran cluster" berarti "server komet".
Banyak situs web besar lainnya membangun server komet mereka sendiri, karena ada perbedaan antara kebutuhan setiap perusahaan. Tetapi membangun server comet Anda sendiri di server open source comet adalah pendekatan yang baik.
Anda dapat mencoba icomet , server komet C1000K C ++ yang dibuat dengan libevent. icomet juga menyediakan perpustakaan JavaScript, mudah digunakan sesederhana:
icomet mendukung berbagai Peramban dan OS, termasuk Safari (iOS, Mac), IEs (Windows), Firefox, Chrome, dll.
sumber
Facebook menggunakan MQTT bukan HTTP. Push lebih baik daripada polling. Melalui HTTP kita perlu polling server terus menerus tetapi melalui server MQTT mendorong pesan ke klien.
Perbandingan antara MQTT dan HTTP: http://www.youtube.com/watch?v=-KNPXPmx88E
Catatan: jawaban saya paling cocok untuk perangkat seluler.
sumber
Salah satu masalah penting dengan polling panjang adalah penanganan kesalahan. Ada dua jenis kesalahan:
Permintaan mungkin akan habis dalam hal ini klien harus segera membangun kembali koneksi. Ini adalah peristiwa normal dalam pemungutan suara panjang ketika tidak ada pesan yang datang.
Kesalahan jaringan atau kesalahan eksekusi. Ini adalah kesalahan aktual yang harus diterima klien dengan anggun dan menunggu server kembali online.
Masalah utama adalah bahwa jika penangan kesalahan Anda membangun kembali koneksi segera juga untuk kesalahan tipe 2, klien akan DOS server.
Kedua jawaban dengan contoh kode ketinggalan ini.
sumber