sql >> Databáze >  >> NoSQL >> Redis

Redis sub/pub a php/nodejs

Možnost 3

Když aktualizujete MySQL z PHP, publikujete tyto změny do node.js prostřednictvím redis publish příkaz (publikovat z PHP při mutaci databáze). Z node.js bych tyto změny obdržel v reálném čase díky předplatnému Redis. Pak bych je jen vysílal zájemcům přes socket.io. Můžete například publish do kanálu mysql . Vezměte si například následující příkaz SQL => INSERT INTO comments (1, "Hello World") . Kde 1 je něco jako userid a Hello World bylo by to něco jako komentář. Pravděpodobně bych na tento kanál nepublikoval příkaz SQL, ale místo toho JSON, který mohu snadno použít jak z JavaScriptu (JSON.stringify / JSON.parse), tak z PHP (json_encode / json_decode).

Aktualizovat

Neprovozujete cron-job, protože by to zmařilo účel Redisova pubsub. Vezměte si například, že navštěvuji váš web, což je blog na adrese http://localhosts . Četl jsem článek na http://localhost.com/a.php . Níže na webu poskytujete formulář, který mohu použít k odeslání komentáře k tomuto článku:

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>

Odesílám formulář, který má atribut akce http://localhost/postcomment.php . Ale tohle je ta důležitá část! Na adrese post.php načtete data, která jsem zveřejnil, a vložíte je do MySQL pomocí INSERT INTO comments (1, "Hello World") . Když k této mutaci dojde, musíte také informovat proces node.js, který neustále poslouchá kanál 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 vyžaduje predis.

Kód uzlu s node_redis by vypadal nějak takto:

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

Tyto ukázky závisí na následujících balíčcích, které můžete nainstalovat pomocí npm

npm install socket.io
npm install redis
npm install express

Vždy, když zveřejním formulář post.php , tyto změny zveřejňuji také na redis. Tato část je důležitá! Proces node.js vždy přijímá tyto změny díky Redis's pubsub. Pokaždé, když php skript zmutuje databázi, měli byste tyto změny publikovat do Redis pomocí publish .

P.S:Doufám, že je to jasné. Možná později, až budu mít trochu času, aktualizuji možná malým úryvkem...




  1. Docker&Celery - CHYBA:Pidfile (celerybeat.pid) již existuje

  2. Operátor agregačního potrubí MongoDB $gte

  3. Redis sub/pub a php/nodejs

  4. MongoDB $add