2010-09-15 21 views
6

Sé que hay tecnologías de servidor Comet que hacen esto, pero quiero escribir algo simple y de cosecha propia.MySQL trigger + notificar a una larga conexión de Apache/PHP

Cuando se inserta un registro en una tabla MySQL, quiero que de alguna manera comunique estos datos a una serie de conexiones apache de larga data utilizando PHP (o lo que sea). Así que varias personas están "escuchando" a través de su navegador y en el momento en que ocurre el INSERT de MySQL, se envía a su navegador y se ejecuta.

La manera más fácil es hacer que la secuencia de comandos PHP sea la base de datos MySQL, pero esto realmente no empuja desde el servidor e introduce un orden inaceptable de consultas de bases de datos innecesarias. Quiero obtener esos datos de MySQL a la conexión de larga duración esencialmente sin que los oyentes consulten en absoluto.

¿Alguna idea sobre cómo implementar esto?

Respuesta

0

Esto es algo que he estado buscando también durante muchos años. No he encontrado ninguna funcionalidad en la que el servidor SQL envíe un mensaje sobre INSERTS, DELETE y UPDATES.

TRIGGERS puede ejecutar SQL en estos eventos, pero eso no sirve de nada aquí.

Supongo que tiene que construir su propio sistema. Puede transmitir fácilmente un UDP desde PHP (Example in first comment), el problema es que PHP se está ejecutando en el servidor y los clientes son estáticos.

Supongo que podría hacer un Applet de Java ejecutándose en el cliente, escuchando el mensaje UDP y luego activando una actualización de la página.

Ésta era sólo algunos pensamientos en el momento de la escritura ...

+0

Tal vez el gatillo podría escribir algo como memcached y el PHP podría sondear eso? – phazei

+0

PHP es estático y no está "ejecutándose" en segundo plano. Hay algunos trucos en el libro de cómo hacer que parezca un "hilo", pero luego viene el siguiente problema, actualice la página de los clientes. Yo diría que el sondeo debe ser hecho por AJAX. Podría ser suficiente para sondear la última fecha de modificación (escrita por factores desencadenantes). Si es más nuevo, recarga la página. –

2

He estado tratando todo tipo de ideas para una solución a este, así y la única manera de sacar el sondeo de consultas SQL es sondear un archivo en su lugar. Si el relleno es igual a 0, continúa con el bucle. Si el archivo es igual a 1, el bucle ejecuta consultas SQL y se lo envía a los usuarios. Agrega otro nivel de complejidad, pero creo que significa menos trabajo de mysql pero lo mismo para apache o cualquier daemon en bucle. También podría enviar el comando a un estilo demoníaco de "cometa", pero también va a ir y volverse en cada solicitud por lo que he visto sobre cómo funcionan los enchufes, así que espero que alguien encuentre una solución a esto.

0

MySQL probablemente no es la herramienta adecuada para este problema. Regilero sugirió cambiar su DB, pero una solución más fácil podría ser usar algo como redis, que tiene una función de pub/sub.

http://redis.io/topics/pubsub

Cuestiones relacionadas