2010-06-11 9 views
8

Attualmente ho una chat basata su Ajax, che sto cercando di ottimizzare semplicemente caricando lo script della chat quando si verifica un aggiornamento. Quindi, nulla deve continuare a caricarsi se non è cambiato nulla nel database.Ajax chat - aggiorna solo se c'è un cambiamento

La mia logica attuale dice:

  • funzione JavaScript spara ogni 1/2 secondo per ottenere i registri (setInterval())

Se nulla è cambiato, però, sembra abbastanza inefficiente per continuare ad invocare chattare esso. Invece, quello che vorrei fare è:

  1. funzione controlla JavaScript se ci sono nuovi log nel database
  2. Se SI - caricare i nuovi registri, se NO - Lasciare i ceppi attualmente visualizzate solo.

Come potrei andare su questo, però? La funzione che sto attualmente utilizzando è:

function updateShouts() { 
    $('#chatArea').load('chat.php'); // load chat logs 
} 
setInterval("updateShouts()", 500); // call function every half a second 

risposta

0

Come sapete, la funzione .load riempie un elemento con l'output restituito dal file chat.php. Questa funzione .load fa due passi: effettua una richiesta ajax su chat.php e poi imposta il valore dell'elemento sull'output di chat.php. Quello che vuoi fare è solo il primo passo. Per fare questo uso la funzione .ajax

http://api.jquery.com/jQuery.ajax/

Invece di utilizzare il file file chat.php vorrei suggerire di chiamare un copione diverso come isChatUpdated.php. Quello script farà esattamente come suggerisce il nome e controllerà se ci sono stati cambiamenti nella chat. È quindi possibile utilizzare tale risultato per capire se è necessario chiamare la funzione .load.

+0

Con la funzione di Ajax come si ottiene il valore restituito dallo script php di verifica? – Dave

+0

È necessario specificare una funzione di callback "riuscita". Vedrai come funziona sulla pagina a cui ti ho collegato. –

0

In entrambi i casi è necessario interrogare il db sul lato server, quindi è quasi irrilevante se restituisce dati di registro o un singolo valore.
È possibile decidere di non aggiornare #chatArea, in base a un valore restituito, ma è necessario effettuare un'altra chiamata per recuperare i registri, altrimenti.

1

Un modo relativamente semplice per eseguire questa operazione consiste nell'utilizzare AJAX per scaricare una pagina che indica semplicemente se è stato effettuato un aggiornamento. Ad esempio, puoi recuperare una pagina come checkForUpdate.php con un 1 o uno 0 per indicare se c'è qualcosa di nuovo nella chat. Se hai un 1 indietro, puoi andare avanti e caricare la pagina completa chat.php.

(Se non avete usato AJAX prima, questo è un buon tutorial: http://www.tizag.com/ajaxTutorial/)

Un'altra soluzione (e uno che penso è probabilmente migliore) è quello di caricare una pagina che ha solo il più recente linee di chat. Ad esempio, supponiamo che tu stia visualizzando le righe 1-14 della chat. È quindi possibile utilizzare AJAX per recuperare il contenuto di, ad esempio, getLines.php?s=14. Questa pagina mostrerebbe solo le linee della chat dopo la riga 14. Dovresti quindi aggiungere queste righe alla fine della finestra di chat corrente.

+0

+1 per il solo caricamento di righe "nuove" (per il client). – timdev

3

Vorrei passare timestamp s (o message_id s) insieme a qualsiasi messaggio di chat che lo script sul lato server invia a un client. Quindi il client richiede semplicemente nuovi messaggi e il server invia solo le novità.

Quindi, immagina che ogni messaggio di chat abbia un ID. Mi piacerebbe progettare il mio chat.php ad accettare un parametro in questo modo:

chat.php?since=12345 

12345 sarebbe la id dell'ultimo messaggio il cliente ha visto. chat.php fa essenzialmente qualcosa come:

SELECT * FROM chatmessages WHERE id > $since 

... e passa indietro un bel po 'di struttura di dati (un array di oggetti, codificato in JSON, diciamo).

Quindi, se non ci sono nuovi messaggi di chat, il server sta semplicemente restituendo un array vuoto.

Non penso che tu possa essere più efficiente di così.

EDIT:

mi rendo conto che facendo in questo modo richiede un po 'più di codifica sul lato client. Non stai più semplicemente aggiornando alcuni div con l'intera cronologia della chat. Avrai anche bisogno di avere un gestore sulla tua chiamata ajax che itera sui risultati, e per ogni messaggio, costruisci programmaticamente un div per quella linea, quindi lo aggiunge alla tua chat div.

0

Desidero in primo luogo creare un file chiamato ad esempio messages.php che sembrava qualcosa di simile:

<?php header('Content-Type: application/json'); 

$messages_since = !empty($_POST['since']) 
    ? mysql_real_escape($_POST['since']) 
    : '0000-00-00 00:00:00'); 

// Get all messages from database since the $messages_since date_time 

echo json_encode($array_with_messages); 

Poi sul lato client utilizzando jQuery o qualcosa di simile che avrei fatto qualcosa di simile:

  1. Ricevi messaggi utilizzando qualcosa di simile $.post('messages.php', new_messages_handler)
  2. Nel gestore vorrei creare html per ogni nuovo messaggio siamo tornati e aggiungere/anteporre al contenitore Chat così come deposito che cosa il tempo gli ultimi mes il saggio è stato creato.
  3. aspettare un po '
  4. ottenere nuovi messaggi usando qualcosa come $.post('messages.php', {since: latest_datetime_we_have}, new_messages_handler)
  5. Vai a 2

almeno funziona abbastanza bene nella mia testa: p

Problemi correlati