2009-08-10 8 views
6

Ho notato che alcuni dei miei siti ajax-heavy (quelli che visito, non quelli che ho creato), hanno certe funzionalità di auto-aggiornamento. Ad esempio, in GMail, se ricevo un nuovo messaggio, vedo il nuovo messaggio senza ricaricare la pagina. È lo stesso con il client di messaggistica istantanea basato su browser di Facebook. Da quello che posso dire, non ci sono applet java che gestiscono l'associazione server-browser, quindi sono lasciato ad assumere che sia fatto da AJAX e forse da qualche elemento di cui non sono a conoscenza. Quindi, la mia ipotesi migliore, è fatta in due modi:Reverse AJAX? Le modifiche ai dati possono essere "PUSHED" per lo script?

  1. Il javascript fa un "ping" stabile a uno script lato server, la verifica di eventuali aggiornamenti che potrebbero essere disponibili (il che spiegherebbe perché alcuni di queste pagine portano a galla qualsiasi altra pagina pesante). oppure

  2. Il javascript si blocca e uno script sul lato server in realtà "Spinge" qualsiasi aggiornamento al browser. Ma non sono sicuro che sia possibile. Immagino che ci sia una sorta di funzione AJAX che fa ancora ping, ma tutto ciò richiede semplicemente "eventuali aggiornamenti?" e lo script del server ha un semplice booleano che dice "no" o "Sono contento che tu abbia chiesto". Ma se questo è il caso, qualsiasi modifica dei dati dovrebbe richiamare direttamente lo script in modo che abbia i cambiamenti dei dati pronti e apporti la modifica a quella funzione booleana.

Quindi è possibile/fattibile/come funziona? Immagino qualcosa del tipo:

Qualcuno invia un aggiornamento email/IM/DB al server, il server chiama lo script utilizzando l'URL dello script più alcune variabili GET rilevanti, lo script annota la modifica e aggiorna la variabile "aggiornamenti disponibili" , l'AJAX ottiene la risposta che ci sono in effetti degli aggiornamenti, l'AJAX esegue le sue normali funzioni di "pagina di aggiornamento", che esegue i normali script di aggiornamento e li trasmette al browser.

Chiedo perché sembra davvero inefficiente che il js stia facendo solo un controllo costante che richiede a) il server di fare il lavoro ogni 1,5 secondi, eb) il mio browser di fare il lavoro ogni 1,5 secondi solo così che sul mio capo Posso dire "Oh ragazzo, ho ricevuto un messaggio istantaneo, proprio come un vero client di messaggistica istantanea!"

risposta

6

leggere su Comet

+0

Wow, ho persino usato le stesse frasi. è quasi imbarazzante.Ma la mia ricerca iniziale su come farlo in PHP menziona script infiniti. Un ciclo infinito deve svolgersi da qualche parte lungo la linea per far funzionare questo tipo di cose? Perché l'origine dati effettivamente modificata (server IMAP, DB, file txt e così via) non può far scattare lo script e gestire le cose? – Anthony

0

realtà ho lavorato su un piccolo .NET Web App che utilizza l'Ajax con la tecnica descritta polling lungo.

A seconda della tecnologia utilizzata, è possibile utilizzare i meccanismi di segnalazione dei thread per mantenere la richiesta finché non viene recuperato un aggiornamento. Con ASP.NET sto facendo funzionare il mio server su una singola macchina, quindi memorizzo un riferimento al mio oggetto Producer (che contiene un thread che elabora i dati). Per avviare la raccolta dei dati, viene chiamato il metodo di iscrizione del mio servizio, che crea un oggetto Consumer registrato con il produttore. Se il Consumer è una modalità di polling lungo, ha un AutoResetEvent che viene segnalato ogni volta che riceve nuovi dati e ogni volta che il client Web effettua una richiesta di dati, il Consumatore attende prima l'evento di reset, quindi lo restituisce.

Ma stai parlando di PHP - per quanto ne so, la persistenza viene mantenuta attraverso la serializzazione, non mantenendo in realtà l'oggetto in memoria, quindi non so come potresti fare riferimento a un oggetto Producer usando $ _CACHE [] o $ _SESSION []. Quando ho sviluppato in PHP non ho mai saputo nulla del multithreading, quindi non ho giocato con esso, ma immagino che tu possa esaminarlo.

L'utilizzo di loop infiniti consumerà molta della tua potenza di elaborazione: prima esaurirò tutte le altre opzioni.

Problemi correlati