2010-09-15 15 views
6

Je sais qu'il existe des technologies de serveur Comet qui font cela, mais je veux écrire quelque chose de simple et d'origine locale.MySQL trigger + notifier une connexion Apache/PHP à longue interrogation

Lorsqu'un enregistrement est inséré dans une table MySQL, je souhaite qu'il communique ces données à une série de connexions Apache interrogées depuis longtemps en utilisant PHP (ou autre). Donc, plusieurs personnes "écoutent" via leur navigateur et la seconde MySQL INSERT arrive, elle est envoyée à leur navigateur et exécutée.

La méthode la plus simple consiste à faire interroger le script PHP par la base de données MySQL, mais cela ne pousse pas vraiment le serveur et introduit un ordre inacceptable de requêtes de base de données inutiles. Je veux obtenir ces données de MySQL à la connexion à interrogation longue essentiellement sans interrogation des auditeurs du tout.

Des idées sur la façon de mettre en œuvre cela?

Répondre

0

C'est aussi quelque chose que je recherchais depuis de nombreuses années. Je n'ai trouvé aucune fonctionnalité où le serveur SQL envoie un message sur INSERTS, DELETE et UPDATES. TRIGGERS peut exécuter SQL sur ces événements, mais cela ne sert à rien ici. Je suppose que vous devez construire votre propre système. Vous pouvez facilement diffuser un UDP à partir de PHP (Example in first comment), le problème est que PHP est en cours d'exécution côté serveur et que les clients sont statiques. Je pense que vous pourriez faire une applet Java en cours d'exécution sur le client, en écoutant le message UDP, puis déclencher une mise à jour de la page.

Ce fut seulement quelques réflexions au moment de l'écriture ...

+0

Peut-être le déclencheur pourrait écrire quelque chose comme memcached et le PHP pourrait sondage qui? – phazei

+0

PHP est statique et ne fonctionne pas en arrière-plan. Il ya quelques astuces sur le livre de la façon de le faire apparaître comme un «fil», mais vient ensuite le prochain problème, mettre à jour la page des clients. Je dirais que l'interrogation doit être faite par AJAX. Il pourrait suffire d'interroger la dernière date modifiée (écrite par des déclencheurs). Si c'est plus récent, rechargez la page. –

2

J'ai essayé toutes sortes d'idées pour une solution à cela aussi bien et la seule façon de prendre le vote des requêtes SQL est de interroger un fichier à la place. Si le remplissage est égal à 0, continuez en boucle. Si le fichier est égal à 1, lancez les requêtes sql en boucle et envoyez-les aux utilisateurs. Cela ajoute un autre niveau de complexité mais je pense que cela signifie moins de travail de la part de mysql mais de même pour apache ou n'importe quel démon en boucle. Vous pouvez également envoyer la commande à un style "comète" de démon, mais cela va se répercuter sur chaque requête ainsi que sur ce que j'ai vu sur le fonctionnement des sockets, donc j'espère que quelqu'un trouvera une solution à cela.

0

MySQL n'est probablement pas le bon outil pour ce problème. Regilero a suggéré de changer de base de données, mais une solution plus facile pourrait être d'utiliser quelque chose comme redis qui a une fonction pub/sub.

http://redis.io/topics/pubsub