sql >> Databasteknik >  >> NoSQL >> Redis

Redis sub/pub och php/nodejs

Alternativ 3

När du uppdaterar MySQL från PHP publicerar du dessa ändringar till node.js via redis publish kommando (publicera från PHP vid mutering av databas). Från node.js skulle jag få dessa ändringar i realtid tack vare Redis prenumeration. Då skulle jag bara sända dem till intresserade användare via socket.io. Du kan till exempel publish till kanal mysql . Ta till exempel följande SQL-sats => INSERT INTO comments (1, "Hello World") . Där 1 är något som användar-id och Hello World skulle vara något liknande kommentaren. Jag skulle förmodligen inte publicera SQL-satsen till den kanalen, utan JSON istället som jag enkelt kan använda både från JavaScript(JSON.stringify / JSON.parse) och PHP(json_encode / json_decode).

Uppdatera

Du kör inte ett cron-jobb eftersom detta skulle motverka syftet med Redis pubsub. Ta till exempel jag besöker din webbplats som är en blogg på http://localhosts . Jag läste en artikel på http://localhost.com/a.php . Nedan på sidan tillhandahåller du ett formulär som jag kan använda för att kommentera artikeln:

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>

Jag skickar in formuläret som har åtgärdsattributet http://localhost/postcomment.php . Men det här är den viktiga delen! På post.php du hämtar informationen som jag har lagt upp och infogar den i MySQL med INSERT INTO comments (1, "Hello World") . När denna mutation inträffar måste du också informera node.js process som kontinuerligt lyssnar på kanalen 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 kräver predis.

Nodkoden med node_redis skulle se ut ungefär så här:

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

Dessa exempel beror på följande paket, som du kan installera via npm

npm install socket.io
npm install redis
npm install express

Alltid när jag postar formuläret post.php , jag publicerar även dessa ändringar till redis. Den här delen är viktig! Node.js-processen tar alltid emot dessa ändringar tack vare Redis pubsub. Varje gång ett php-skript muterar databasen bör du publicera dessa ändringar till Redis med publish .

PS:Hoppas detta är tydligt. Kanske senare när jag har lite tid tillgänglig uppdaterar jag med kanske litet utdrag...




  1. MongoDb via jndi

  2. Varför finns det NYCKEL- och ARGV-matriser när man anropar Redis Lua-skript?

  3. Inuti Santander's Near Real-Time Data Ingest Architecture

  4. actionkabel som prenumererar lokalt, men inte på heroku