Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Redis sub/pub i php/nodejs

Opcja 3

Kiedy aktualizujesz MySQL z PHP, publikujesz te zmiany w node.js przez redis publish command(opublikuj z PHP podczas mutacji bazy danych). Z node.js otrzymywałbym te zmiany w czasie rzeczywistym dzięki subskrypcji Redis. Wtedy po prostu nadałbym je użytkownikom zainteresowanym przez socket.io. Możesz na przykład publish na kanał mysql . Weźmy na przykład następującą instrukcję SQL => INSERT INTO comments (1, "Hello World") . Gdzie 1 jest czymś w rodzaju identyfikatora użytkownika i Hello World byłby podobny do komentarza. Prawdopodobnie nie publikowałbym instrukcji SQL na tym kanale, ale zamiast tego JSON, którego mogę łatwo używać zarówno z JavaScript (JSON.stringify / JSON.parse), jak i PHP (json_encode / json_decode).

Aktualizacja

Nie prowadzisz pracy crona, ponieważ to zniweczyłoby cel pubsub Redisa. Weźmy na przykład odwiedzam twoją witrynę, która jest blogiem pod adresem http://localhosts . Przeczytałem artykuł na http://localhost.com/a.php . Poniżej na stronie podajesz formularz, za pomocą którego mogę skomentować ten artykuł:

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>

Przesyłam formularz, który ma atrybut akcji http://localhost/postcomment.php . Ale to jest ważna część! W post.php pobierasz przesłane przeze mnie dane i wstawiasz je do MySQL za pomocą INSERT INTO comments (1, "Hello World") . Kiedy ta mutacja się wydarzy, musisz również poinformować proces node.js, który nieustannie nasłuchuje kanału 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 wymaga predyspozycji.

Kod węzła z node_redis wyglądałby mniej więcej tak:

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

Te próbki zależą od następujących pakietów, które można zainstalować za pomocą npm

npm install socket.io
npm install redis
npm install express

Zawsze, gdy wysyłam formularz post.php , publikuję również te zmiany w redis. Ta część jest ważna! Proces node.js zawsze otrzymuje te zmiany dzięki subskrypcji Redisa. Za każdym razem, gdy skrypt php mutuje bazę danych, powinieneś opublikować te zmiany w Redis za pomocą publish .

PS:Mam nadzieję, że to jasne. Może później, kiedy będę miał trochę wolnego czasu, zaktualizuję może małym fragmentem...




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Klient połączenia w puli usługi Redis ServiceStack

  2. Jaki jest sens wielu baz danych Redis?

  3. Korzystanie z jedis, jak pisać do określonego gniazda/węzła w klastrze redis

  4. ZRANGESTORE przed Redis 6.2.0

  5. Jak ustawić hasło dla Redis?