Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Redis sub/pub und php/nodejs

Möglichkeit 3

Wenn Sie MySQL von PHP aus aktualisieren, veröffentlichen Sie diese Änderungen in node.js über redis publish Befehl (von PHP veröffentlichen, wenn die Datenbank verändert wird). Von node.js würde ich diese Änderungen dank Redis' Abonnement in Echtzeit erhalten. Dann würde ich sie einfach über socket.io an interessierte Benutzer übertragen. Sie könnten zum Beispiel publish um mysql zu kanalisieren . Nehmen Sie zum Beispiel die folgende SQL-Anweisung => INSERT INTO comments (1, "Hello World") . Wobei 1 ist so etwas wie userid und Hello World wäre so etwas wie der Kommentar. Ich würde wahrscheinlich keine SQL-Anweisung in diesem Kanal veröffentlichen, sondern stattdessen JSON, das ich problemlos sowohl von JavaScript (JSON.stringify / JSON.parse) als auch von PHP (json_encode / json_decode) verwenden kann.

Aktualisieren

Sie führen keinen Cron-Job aus, da dies den Zweck von Redis 'Pubsub zunichte machen würde. Nehmen wir zum Beispiel, ich besuche Ihre Website, die ein Blog unter http://localhosts ist . Ich habe einen Artikel unter http://localhost.com/a.php gelesen . Unten auf der Website stellen Sie ein Formular bereit, das ich verwenden kann, um einen Kommentar zu diesem Artikel abzugeben:

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>

Ich sende das Formular mit dem Aktionsattribut http://localhost/postcomment.php . Aber das ist der wichtige Teil! Unter post.php Sie rufen die von mir geposteten Daten ab und fügen sie mit INSERT INTO comments (1, "Hello World") in MySQL ein . Wenn diese Mutation auftritt, müssen Sie auch den node.js-Prozess informieren, der ständig auf Kanal mysql lauscht :

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 erfordert Prädis.

Der Knotencode mit node_redis würde etwa so aussehen:

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

Dieses Beispiel hängt von den folgenden Paketen ab, die Sie über npm

installieren können
npm install socket.io
npm install redis
npm install express

Immer wenn ich das Formular poste post.php , veröffentliche ich diese Änderungen auch in redis. Dieser Teil ist wichtig! Der node.js-Prozess empfängt diese Änderungen dank Pubsub von Redis immer. Jedes Mal, wenn ein PHP-Skript die Datenbank verändert, sollten Sie diese Änderungen mit publish in Redis veröffentlichen .

P.S.:Ich hoffe, das ist klar. Vielleicht später, wenn ich etwas Zeit habe, aktualisiere ich mit vielleicht einem kleinen Ausschnitt...