sql >> Base de Datos >  >> NoSQL >> Redis

Redis sub/pub y php/nodejs

Opción 3

Cuando actualiza MySQL desde PHP, publica esos cambios en node.js a través de redis publish comando (publicar desde PHP al mutar la base de datos). Desde node.js recibiría esos cambios en tiempo real gracias a la suscripción de Redis. Luego, simplemente los transmitiría a los usuarios interesados ​​a través de socket.io. Podría, por ejemplo, publish al canal mysql . Tomemos, por ejemplo, la siguiente instrucción SQL => INSERT INTO comments (1, "Hello World") . Donde 1 es algo así como ID de usuario y Hello World sería algo así como el comentario. Probablemente no publicaría una declaración SQL en ese canal, sino JSON, que puedo usar fácilmente desde JavaScript (JSON.stringify / JSON.parse) y PHP (json_encode / json_decode).

Actualizar

No ejecuta un trabajo cron porque esto anularía el propósito del pubsub de Redis. Tomemos como ejemplo que visito su sitio web, que es un blog en http://localhosts . Leí un artículo en http://localhost.com/a.php . A continuación, en el sitio, proporciona un formulario que puedo usar para publicar un comentario en ese artículo:

a.php

<html>
<head>
    <title>Interesting blog post</title>
</head>
<body>
    <div id="article">This is interesting</div>

    <div id="comments">
        <div class="comment">
            <div class="from">Alfred Said at 22:34</div>
            <div class="message">Hello World</div>
        </div>
    </div>

    <form action="post.php" method="post">
        <label for="name">Your name</label><br />
        <input type="name" id="name" name="name" /><br />

        <label for="message">Your Message:</label><br />
        <textarea id="message" name="message"></textarea>

        <input type="submit" />
    </form>


    <script src='jquery.min.js'></script>
    <script src='http://localhost:8888/socket.io/socket.io.js'></script>
    <script type="text/javascript">
        $(document).ready(function () {
                var socket = io.connect('http://localhost:8888');

                socket.on('message', function (json) {
                    var obj = $.parseJSON(json);
                    alert('in here: ' + obj.name);
                });
        });
    </script>
</body>
</html>

Envío el formulario que tiene el atributo de acción http://localhost/postcomment.php . ¡Pero esta es la parte importante! En post.php recuperas los datos que publiqué y los insertas en MySQL usando INSERT INTO comments (1, "Hello World") . Cuando ocurre esta mutación, también debe informar al proceso node.js que escucha continuamente el canal mysql :

publicación.php:

<?php

$_POST  = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

require("./Predis.php");
$redis = new Predis\Client();
$obj = array(
    'name'      => $_POST['name'],
    'message'   => $_POST['message']
);

$json = json_encode($obj);
$redis->publish("mysql", $json);

echo $json;

post.php requiere predis.

El código de nodo con node_redis se vería así:

var redis       = require('redis'),
    subscriber  = redis.createClient(),
    express     = require('express'),
    store       = new express.session.MemoryStore(),
    app         = express.createServer(
        express.bodyParser(),
        express.static(__dirname + '/public'),
        express.cookieParser(),
        express.session({ secret: 'htuayreve', store: store}))
    sio         = require('socket.io');

app.listen(8888, '127.0.0.1',  function () {
    var addr = app.address();
    console.log('app listening on http://' + addr.address + ':' + addr.port);
});

var io = sio.listen(app);

io.configure(function () {
    io.set('log level', 1); // reduce logging
});

io.sockets.on('connection', function (socket) {
    socket.join('mysql');   
    socket.on('disconnect', function () {
    });
});

subscriber.on('message', function (channel, json) {
    // this will always retrieve messages posted to mysql
    io.sockets.in('mysql').json.send(json);
});

subscriber.subscribe('mysql');

Estas muestras dependen de los siguientes paquetes, que puede instalar a través de npm

npm install socket.io
npm install redis
npm install express

Siempre cuando publico el formulario post.php , también publico estos cambios en redis. ¡Esta parte es importante! El proceso node.js siempre recibe esos cambios gracias al pubsub de Redis. Cada vez que un script php muta la base de datos, debe publicar estos cambios en Redis con publish .

PD:Espero que esto quede claro. Tal vez más tarde, cuando tenga algo de tiempo disponible, actualice con un pequeño fragmento...