2009-06-08 12 views

risposta

8

No. I clienti devono "sondaggio", il server repeatadly.

Penso che la chiave qui sia pensare all'interaction design. Il trucco è ingannare l'utente nel pensare che la chat sia istantanea, ma quando in realtà si aggiorna una volta ogni 1 o 2 o 3 o 10 secondi.

Idee:

1) Quando l'utente invia un messaggio, mostrano direttamente nella chat e innescare un sondaggio.

2) Se un sondaggio torna con più messaggi da altri utenti, non aggiungerli tutti in una volta, in realtà aggiungili per un periodo di 1-2 secondi circa, con spaziatura casuale, facendolo apparire come stanno arrivando "istantaneamente" e indipendentemente.(Se un gruppo di messaggi viene visualizzato in una sola volta, l'utente è molto rapido a rendersi conto che la chat viene aggiornata lì e poi, e non continuamente.)

3) Se l'utente è inattivo per x quantità di tempo. Lascia cadere il polling su una volta ogni 10 secondi circa.

4) Se l'utente è attivo, ovvero invia molti messaggi, esegue il polling più spesso.

5) Avere un file statico per ogni canale in cui si scrive l'ora in cui è stata aggiornata la chat. Ad esempio il file chat-teenfun-lastupdate.txt ha il contenuto 1224934239 o qualsiasi formato di tempo che preferisci. Serve questo file in modo statico e lascia che i client eseguano il polling di questo file per verificare se il canale è stato aggiornato, piuttosto che chiamare chat-poll.php?ch=teenfun che esegue un controllo dinamico. I file statici vengono serviti circa 10-100 volte più velocemente, a seconda del lavoro richiesto per lo script dinamico, e ne avrai bisogno quando riceverai più di 250 utenti che eseguono il polling.

Buona fortuna e buon divertimento!

/0

PS. In alternativa, è possibile consentire ai client di effettuare una chiamata ajax al server e mantenerli "sospesi". In questo modo accetti la loro richiesta e fai finta di ricominciare a inviare i dati, ma poi fai una pausa. Quando qualcosa ti succede, finisci la risposta con i dati approriati. Affinché funzioni, credo che avresti bisogno di scrivere il tuo server HTTP, questo lo fa in modo specifico, dato che non puoi avere 250 processi PHP in giro in memoria. Forse Lighttpd potrebbe essere usato in questo modo in qualche modo con quella mod di cache LUA. Non lo so. Sarebbe interessante però. Devo provarlo qualche volta :)

1

Fintantoché non esiste una tecnologia push HTTP non si otterrà mai una chat in tempo reale utilizzando JavaScript.

Possibili workarrounds:

  • utilizzano un film Flash o un Java applet di eseguire alcune comunicazione socket
  • richieste attesa di polling di nuovo sul lato server per alcuni secondi
+1

Sapete che qui ci sono alcuni esempi di vita reale di tali cose in PHP/JS? Ne scrivo anche uno per il mio lavoro, sì, ha le sue limitazioni ma non è impossibile. Anche senza tecnologia push. – elcuco

+0

tempo reale per me in tempo reale (eccetto la velocità di connessione) ... ma hai ragione: ci sono un sacco di cose fuori che sembrano davvero in tempo reale ... – TheHippo

+0

Credo che quest'ultimo sia l'approccio che usa Facebook Messenger.Non è necessariamente elegante come un approccio client-server convenzionale, forse, ma fa il lavoro. – Rob

6

che ci sia , ma non penso che sarà molto efficiente con molti utenti. È possibile eseguire il polling in cui ciascun client esegue il polling del server per verificare la presenza di nuovi messaggi oppure è possibile utilizzare lo comet technique in cui il server può inviare nuovi messaggi ai client. Verificare lo Comet plugin for XAJAX. Come questo sarebbe implementato usando XAJAX e PHP è oltre me, ma ecco come proverei a implementarlo.

Lasciate ogni cliente connettersi al server (login, ecc), allora:

  1. Per ogni messaggio inviato da un client (mittente) aggiornare la coda di messaggi per il client (ricevitore)
  2. Let client server sondaggio per i nuovi messaggi in coda/Spingi i nuovi messaggi via cometa.
  3. Aggiorna GUI se ci sono nuovi messaggi.
  4. risciacquo, schiuma, ripetere

utilizzo di un vero server di chat come ejabberd potrebbe andare un lungo cammino, essere più efficiente e consentire agli utenti di connettersi tramite client desktop (se è quello che volete). Probabilmente lo userò come back-end, IOW ejabberd sarebbe il server e PHP sarebbe il client che usa XMPP in PHP e agirà come proxy per il webgui.

Consulta anche:
Google Techtalk on Gmail's chat feature (and scalability issues)

Questo è il mio $ 0,02

0

La migliore strategia che ho visto è quella di fare una richiesta AJAX per i messaggi e quindi riavviare esattamente quella stessa richiesta non appena finisce.

Sul lato server, eseguire lo "stallo" dello script per 60 secondi o fino a quando non viene ricevuto un nuovo messaggio. Ciò mantiene aperta la stessa connessione per un massimo di 60 secondi, ma quando viene ricevuto un nuovo messaggio, lo stampa e si interrompe immediatamente, inducendo il lato client AJAX ad aprire un'altra connessione.

Questo fornisce una notifica quasi istantanea di nuovi messaggi ed è anche molto più facile sul server rispetto alla creazione di una nuova connessione ogni x secondi.

1

È possibile utilizzare websockets, ma essendo una nuova funzionalità HTML5 è piuttosto limitato. Fortunatamente per te c'è socksjs, che implementa web socket su browser che non lo gestiscono.

Dal lato dell'hosting dovresti essere in grado di utilizzare qualsiasi server websockets, ce ne sono alcuni per PHP.

+0

non esiste letteralmente un browser principale che non supporti websocket: http://caniuse.com/#feat=websockets – specializt

1

Se si desidera implementare un server di chat scritto con un linguaggio di scripting come PHP/JSP, la tecnica di connessione HTTP sospesa dovrà essere spuntata dal proprio elenco di opzioni. Il motivo è che la maggior parte dei web severs (host appositamente condivisi) non amano troppe connessioni sospese.

In questa pubblicazione "Optimized Chat Server Protocol for Server Side Scripting Languages" è possibile trovare tutto ciò che è necessario per implementare un client Web e un server di chat PHP.

Problemi correlati