2009-11-05 8 views
0

Je suis en train d'utiliser l'actualisation périodique (ajax)/vote sur mon site par XMLHttp (XHR) pour vérifier si un utilisateur a un nouveau message sur la base de données toutes les 10 secondes, alors s'il y a l'informer/elle en créant un div dynamique comme ceci:rafraîchissement périodique ou vote

function shownotice() { 
    var divnotice = document.createElement("div"); 
    var closelink = document.createElement("a"); 
    closelink.onclick = this.close; 
    closelink.href = "#"; 
    closelink.className = "close"; 
    closelink.appendChild(document.createTextNode("close")); 
    divnotice.appendChild(closelink); 
    divnotice.className = "notifier"; 
    divnotice.setAttribute("align", "center"); 
    document.body.appendChild(divnotice); 
    divnotice.style.top = document.body.scrollTop + "px"; 
    divnotice.style.left = document.body.scrollLeft + "px"; 
    divnotice.style.display = "block"; 
    request(divnotice); 
} 

est-ce un moyen fiable ou stable pour vérifier un message spécifique depuis quand je regarde sous firebug, beaucoup de demande va à ma base de données? Est-ce que cette méthode peut faire baisser ma base de données à cause de trop de demandes? Existe-t-il une autre façon de le faire puisque lorsque je me connecte à facebook et vérifie sous firebug, aucune demande ne se passe ou se passe mais je sais qu'ils utilisent aussi l'actualisation périodique ... comment font-ils cela?

Répondre

2

Vous pouvez vérifier les nouvelles données toutes les 10 secondes, mais au lieu de vérifier le db, vous devez faire une vérification plus faible impact. Ce que je ferais est de modifier le processus de mise à jour db de sorte que, lorsqu'il apporte une modification à certaines données, il mette également à jour l'horodatage d'un fichier pour montrer qu'il y a un changement récent.

Si vous voulez une meilleure granularité que « quelque chose a changé quelque part dans la db », vous pouvez le casser par nom d'utilisateur (ou un autre identifiant). Le (s) fichier (s) à mettre à jour serait alors le nom d'utilisateur pour chaque utilisateur qui pourrait être intéressé par la mise à jour. Donc, quand vous demandez au serveur s'il y a des informations pour l'utilisateur X plus récentes que l'heure t, au lieu de faire une requête DB, le script côté serveur peut simplement comparer l'horodatage d'un fichier avec le paramètre time et voir s'il y a quelque chose de nouveau dans la base de données.

Dans le processus qui met à jour le DB, ajoutez le code (en gros) fait:

foreach username interested in this update 
{ 
    touch the file \updates\username 
} 

Ensuite, votre fonction pour voir s'il y a de nouvelles données ressemble à quelque chose comme:

function NewDataForUser (string username, time t) 
{ 
    timestamp ts = GetLastUpdateTime("\updates\username"); 
    return (ts > t); 
} 

Une fois vous trouvez qu'il y a de nouvelles données, vous pouvez ensuite faire une requête DB complète et obtenir toutes les informations dont vous avez besoin.

0

Ceci est assez peu fiable et probablement trop lourd sur le serveur dans la plupart des cas.

Peut-être vous devriez jeter un oeil dans une interface push: http://en.wikipedia.org/wiki/Push_technology

J'ai entendu Comet est la solution la plus évolutive.

0

Je soupçonne Facebook utilise un film Flash (ils téléchargent toujours un appelé SoundPlayerHater.swf) qu'ils utilisent pour faire des comms avec leurs serveurs. Cela ne se fait pas attraper par Firebug (peut-être par Fiddler).

3

J'ai quitté facebook ouvert avec Firebug en cours d'exécution et que je vois des demandes au sujet une fois par minute, ce qui semble beaucoup pour moi.

L'autre approche, utilisée par la comète, est de faire une demande et le laisser ouvert, avec le serveur ruisselant sur les données au client sans terminer la réponse. Ceci est un hack, et viole tous les principes de ce que HTTP est tout au sujet de :). Mais, il fonctionne.

0

Ce n'est pas une meilleure approche. Parce que vous avez fini par interroger votre serveur toutes les 10 secondes, même s'il n'y a pas de véritables mises à jour.Au lieu de cette approche d'interrogation, vous pouvez simuler l'approche de serveur push (reverrse AJAX ou COMET). Cela réduira compeletly la charge de travail de serveur et seulement le client est mis à jour s'il y a une mise à jour du côté de serveur.

Comme par wikipedia

inverse Ajax fait référence à une conception Ajax modèle qui utilise des connexions HTTP à long terme pour permettre une communication à faible latence entre un serveur web et un navigateur . Fondamentalement, c'est un moyen de envoyer des données du client au serveur et un mécanisme pour pousser les données du serveur de nouveau au navigateur.

Pour plus d'informations, consultez mon autre réponse à la similar question