Redis
 sql >> Database >  >> NoSQL >> Redis

Redis sub/pub e php/nodejs

Opzione 3

Quando aggiorni MySQL da PHP, pubblichi le modifiche in node.js tramite redis publish comando (pubblica da PHP durante la mutazione del database). Da node.js riceverei quelle modifiche in tempo reale grazie all'iscrizione di Redis. Quindi li trasmetterei agli utenti interessati tramite socket.io. Potresti ad esempio publish per incanalare mysql . Prendi ad esempio la seguente istruzione SQL => INSERT INTO comments (1, "Hello World") . Dove 1 è qualcosa come userid e Hello World sarebbe qualcosa come il commento. Probabilmente non pubblicherei l'istruzione SQL su quel canale, ma invece JSON che posso usare facilmente sia da JavaScript (JSON.stringify / JSON.parse) che da PHP (json_encode / json_decode).

Aggiorna

Non esegui un cron-job perché ciò vanificherebbe lo scopo del pubsub di Redis. Prendi ad esempio che visito il tuo sito web che è un blog all'indirizzo http://localhosts . Ho letto un articolo su http://localhost.com/a.php . Di seguito sul sito fornisci un modulo che posso utilizzare per pubblicare un commento a quell'articolo:

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>

Invio il modulo che ha l'attributo action http://localhost/postcomment.php . Ma questa è la parte importante! In post.php recuperi i dati che ho pubblicato e li inserisci in MySQL usando INSERT INTO comments (1, "Hello World") . Quando si verifica questa mutazione, devi anche informare il processo node.js che ascolta continuamente il canale mysql :

post.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 richiede predis.

Il codice del nodo con node_redis sarebbe simile a:

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');

Questi esempi dipendono dai seguenti pacchetti, che puoi installare tramite npm

npm install socket.io
npm install redis
npm install express

Sempre quando pubblico il modulo post.php , pubblico anche queste modifiche su redis. Questa parte è importante! Il processo node.js riceve sempre queste modifiche grazie al pubsub di Redis. Ogni volta che uno script php muta il database dovresti pubblicare queste modifiche su Redis con publish .

PS:Spero sia chiaro. Magari più tardi, quando ho un po' di tempo a disposizione, aggiorno con magari un piccolo snippet...