복붙노트

[REDIS] 레디 스 서브 / 퍼브와 PHP / nodejs

REDIS

레디 스 서브 / 퍼브와 PHP / nodejs

MySQL의 DB를 결과를 표시하는 서브 / 퍼브 시스템으로 레디 스를 사용하여 새 프로젝트에 대한 작업을 시작. 업데이트가 있다면 그래서 내 웹 페이지 MySQL에서 해당 업데이트를 게시하고 싶었다. 내 질문은 어떤 옵션을 더 나은 것입니까?

옵션 1: 난 그냥 nodejs와 socket.io를 통해이 모든해야합니까? 레디 스에 연결을 사용하여, 나는 경청 할 필요가 채널을 구독하는 nodejs 스크립트를 만드는 의미 MySQL의에서 nodejs 쿼리 업데이트를 DB, 업데이트가 nodejs를 통해 socket.io에 연결되어있는 HTML에서 다음 MySQL의 행을 게시하는 경우 GET 새로운 데이터 및 프로세스는 결과를 표시하려면?

옵션 2 : PHP 스크립트 쿼리 MySQL과 레디 스 - PHP는 고객과 채널에 대한 업데이트를 게시 적이 있습니까? 그나마 여기에서 설정을 할 다른 무엇을 필요 정확히 알고있다. 나는 아직도이 옵션에 포함 nodejs을해야합니까?

또는 나는 방금 어떻게이 모든 작품을 기반으로 무엇입니까? 결론은 내가 레디 스 서브 / 퍼브 기능을 사용하여 사용자에게 MySQL의 데이터베이스를 통해 결과를 표시 할 수 있습니다.

해결법

  1. ==============================

    1.당신이 PHP에서 MySQL을 업데이트 할 때 당신은 (데이터베이스 돌연변이 때 PHP에서 게시) 명령을 게시 레디 스를 통해 Node.js를에 변경 사항을 게시 할 수 있습니다. Node.js를에서 나는 레디 스의 실시간 덕분에 이러한 변경 구독받을 것입니다. 그럼 난 그냥 socket.io를 통해 관심있는 사용자에게 방송 것입니다. 당신은 예를 들어 MySQL의 채널을 게시 할 수 있습니다. 예를 들어 다음과 같은 SQL 문을 가지고 => INSERT INTO 코멘트 (1, "안녕하세요"). 어디 하나는 사용자 ID 같은 것입니다, 그리고 안녕하세요 세계 주석과 같은 것입니다. 난 아마 그 채널에 SQL 문을 게시하지 것이지만, JSON 대신하는 난 쉽게 자바 스크립트 (JSON.stringify / JSON.parse) 및 PHP (로 json_encode / json_decode)에서 모두 사용할 수 있습니다.

    당신이 PHP에서 MySQL을 업데이트 할 때 당신은 (데이터베이스 돌연변이 때 PHP에서 게시) 명령을 게시 레디 스를 통해 Node.js를에 변경 사항을 게시 할 수 있습니다. Node.js를에서 나는 레디 스의 실시간 덕분에 이러한 변경 구독받을 것입니다. 그럼 난 그냥 socket.io를 통해 관심있는 사용자에게 방송 것입니다. 당신은 예를 들어 MySQL의 채널을 게시 할 수 있습니다. 예를 들어 다음과 같은 SQL 문을 가지고 => INSERT INTO 코멘트 (1, "안녕하세요"). 어디 하나는 사용자 ID 같은 것입니다, 그리고 안녕하세요 세계 주석과 같은 것입니다. 난 아마 그 채널에 SQL 문을 게시하지 것이지만, JSON 대신하는 난 쉽게 자바 스크립트 (JSON.stringify / JSON.parse) 및 PHP (로 json_encode / json_decode)에서 모두 사용할 수 있습니다.

    이 레디 스의 pubsub 오프 목적을 물리 칠 것 때문에 크론 작업을 실행하지 않습니다. // localhosts : 예를 들어 타고 나는 HTTP에서 블로그는 당신의 웹 사이트를 방문하십시오. 나는 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>
    

    나는 action 속성에 http가 양식을 제출 //localhost/postcomment.php합니다. 그러나 이것은 중요한 부분입니다! post.php에서 당신은 내가 게시 된 데이터를 검색 및 INSERT INTO 코멘트 (1, "안녕하세요")를 사용하여 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는 predis이 필요합니다.

    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을 게시 할 때 항상 나는 또한 레디 스에 이러한 변경 사항을 게시 할 수 있습니다. 이 부분은 중요하다! Node.js를 공정은 항상 사람들은 레디 스의 pubsub 덕분에 변화 받고있다. PHP 스크립트 변이가 데이터베이스 게시와 레디 스에 이러한 변경 사항을 게시해야 할 때마다.

    P.S : 희망이 분명하다. 어쩌면 나중에 나는 어쩌면 작은 조각과 약간의 시간 사용 가능한 I 업데이트가있을 때 ...

  2. from https://stackoverflow.com/questions/6891342/redis-sub-pub-and-php-nodejs by cc-by-sa and MIT license