2015-09-14 3 views
0

Je suis nouveau sur PHP. Je vais faire une application web simple en utilisant PHP, une boîte de dialogue.Actualiser la boîte de dialogue lorsque le nouveau message a été reçu

Je ne connais pas de meilleure façon d'actualiser la fenêtre de discussion dès la réception d'un nouveau message. La seule chose qui me vient à l'esprit est de rafraîchir la page fréquemment. Je sais que ce n'est pas une bonne idée. Je sais comment utiliser AJAX, donc je ne peux rafraîchir que la boîte de dialogue (sans rafraichir la page entière). Mais dans AJAX également, le client doit envoyer une demande.

Existe-t-il un moyen d'actualiser la boîte de dialogue par le serveur lorsqu'un nouveau message est reçu?

+2

Un exemple de code aiderait beaucoup. Avoir besoin d'un indicateur que les deux clients peuvent voir, alors peut-être un élément de base de données ou un fichier qui est touché. Ensuite, utilisez AJAX. Lorsque le message est entré et soumis, l'indicateur est défini sur "TRUE". L'autre client peut alors continuer à vérifier ce drapeau (peut-être aussi par AJAX). Une fois qu'il remarque qu'il est retourné à "VRAI", il peut collecter et afficher le message, en remettant le drapeau à "FAUX". – Twisty

+0

Les prises Web me viennent à l'esprit, mais je n'ai aucune expérience personnelle avec elles, donc je ne serai pas capable d'aider –

Répondre

0

L'ordre de communication standard dans les applications Web est que les requêtes HTTP sont initiées par le client Web (navigateur), puis répondues par le serveur.

Ce dont vous avez besoin, c'est que les rôles soient inversés et que l'ordinateur serveur demande à l'ordinateur client de recevoir un message. Ce numéro est appelé server push. L'article Wikipedia lié énumère beaucoup de solutions de contournement. Le client demandant à plusieurs reprises au serveur si un nouveau message est arrivé est la méthode la plus simple, elle est appelée interrogation, mais fait avec une haute fréquence met le serveur sous tension (multiplié si plusieurs clients le font) et avec une basse fréquence n'est pas assez réactif pour de nombreux cas d'utilisation.

Malgré la grande police utilisée par l'utilisateur emsch, WebSockets ne sont pas réalisables pour tout le monde (encore), car tous les navigateurs ne le supportent pas. Comparez votre navigateur/os matrice e.g. avec browser implementation. Mon préféré il ya quelques années était BOSH, que je préférais à d'autres méthodes comme Comet: BOSH a besoin d'une connexion détenue par le serveur pour que le serveur soit réactif et une deuxième connexion potentielle au serveur pour que le client soit réponse. Comme les délais peuvent arriver, les échanges vides sont effectués avec une fréquence basse après un certain temps.Donc, si aucun message n'arrive au serveur ou au client, BOSH se comporte comme une interrogation lente.

Si vous êtes nouveau sur le web et le développement de réseau, je suggère de chercher une belle bibliothèque de messagerie.

  • Si vous avez besoin pour soutenir des navigateurs plus anciens une bibliothèque qui prend en charge plusieurs des techniques mentionnées et retombe au meilleur des cas applicable
  • Si vous pouvez utiliser les navigateurs modernes, optez pour des WebSockets base lib.
0

Oui, il existe un moyen d'avertir le client par le serveur. Il est appelé

WebSocket.

Avec cette technologie, vous pouvez envoyer des données du serveur au client et vice versa à tout moment. Il crée une connexion TCP et la garde ouverte jusqu'à ce que vous la fermiez manuellement.

Je ne l'ai pas encore utilisé en php, mais une recherche rapide sur google m'a donné quelques résultats de bibliothèques, vous devriez donc trouver une solution appropriée. Cependant, je pense qu'un serveur node.js, sur un autre serveur continuus, conviendrait mieux pour cette fonctionnalité.

Du côté client, vous pouvez ensuite communiquer via le WebSocket en JavaScript.
Ouvrez la première connexion

var webSocket = new WebSocket("ws://www.example.com/socketserver"); 

Ensuite, vous pouvez attendre le trafic entrant et traiter les données en fonction

webSocket.onmessage = function (event) { 
    console.log(event.data); 
} 

Ceci est juste un aperçu très court. Vous trouverez de nombreuses informations sur ce sujet, par exemple dans le Mozilla Developer Network