sql >> データベース >  >> NoSQL >> Redis

Redis sub/pubおよびphp/nodejs

    オプション3

    PHPからMySQLを更新する場合、それらの変更をredis publishを介してnode.jsに公開します。 コマンド(データベースを変更するときにPHPから公開)。 node.jsから、Redisのサブスクライブのおかげで、これらの変更をリアルタイムで受け取ることができます。次に、socket.ioを介して関心のあるユーザーにそれらをブロードキャストします。たとえば、publish チャネルmysql 。たとえば、次のSQLステートメント=> INSERT INTO comments (1, "Hello World") 。ここで1 useridのようなもので、Hello World コメントのようなものになります。私はおそらくSQLステートメントをそのチャネルに公開しませんが、代わりにJavaScript(JSON.stringify / JSON.parse)とPHP(json_encode / json_decode)の両方から簡単に使用できるJSONを公開します。

    更新

    cronジョブを実行しないでください。これは、Redisのpubsubの目的を無効にするためです。たとえば、http://localhostsのブログであるあなたのWebサイトにアクセスします。 。 http://localhost.com/a.phpの記事を読みました 。以下のサイトで、その記事にコメントを投稿するために使用できるフォームを提供します:

    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>
    

    アクション属性http://localhost/postcomment.phpを持つフォームを送信します 。しかし、これは重要な部分です! post.phpで 私が投稿したデータを取得し、INSERT INTO comments (1, "Hello World")を使用してMySQLに挿入します。 。このミューテーションが発生した場合は、チャネルmysqlを継続的にリッスンしているnode.jsプロセスにも通知する必要があります。 :

    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 前提条件が必要です。

    node_redisのノードコードは次のようになります:

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

    このサンプルは、npmを介してインストールできる次のパッケージに依存しています

    npm install socket.io
    npm install redis
    npm install express
    

    フォームを投稿するときは常にpost.php 、これらの変更をredisに公開します。この部分は重要です! node.jsプロセスは、Redisのpubsubのおかげで、常にこれらの変更を受け取ります。 phpスクリプトがデータベースを変更するたびに、publishを使用してこれらの変更をRedisに公開する必要があります 。

    追記:これが明確であることを願っています。たぶん、後で利用できる時間があれば、小さなスニペットで更新します...




    1. ネストされた配列を更新するMeteormongo

    2. mongodbで一意のオブジェクトIDを生成する方法

    3. NginxとPHP-7.3を使用したUbuntu16.04/18.04へのMemcachedのインストール

    4. Beanstalkdと同様のCLIを使用してRedisをキューエンジンとして監視するにはどうすればよいですか?