Redis sub / pub и php / nodejs

Начало работы над новым проектом с использованием redis в качестве системы sub / pub для отображения результатов из mysql db. Поэтому, если есть обновления, я хотел бы опубликовать эти обновления с mysql на моей веб-странице. Мой вопрос в том, какой вариант будет лучше?

Вариант 1: Должен ли я делать все это через nodejs и socket.io? Смысл создания сценария nodejs, который подключается к redis, подписываться на каналы, которые мне нужно прослушать, используя mysql в nodejs, запрашивать db для обновлений, если обновления публикуют строки mysql, а затем в html, который подключается к nodejs через socket.io get новые данные и обрабатывать их для отображения результатов?

Вариант 2. У вас есть запрос php-скрипта mysql и с клиентом redis-php публиковать любые обновления канала? Не знаю точно, что еще нужно настроить здесь. Мне все еще нужно иметь nodejs, участвующих в этой опции?

Или я просто от того, как все это работает? Суть в том, что я хочу отображать результаты через базу данных mysql пользователю, используя возможности redis sub / pub.

Вариант 3

Когда вы обновляете MySQL с PHP, вы публикуете эти изменения в node.js с помощью команды redis publish (публиковать из PHP при изменении базы данных). От node.js я получаю эти изменения в режиме реального времени благодаря подписке Redis. Затем я просто передал их пользователям, заинтересованным через socket.io. Например, вы можете publish на канале mysql . Возьмем, к примеру, следующий оператор SQL => INSERT INTO comments (1, "Hello World") . Где 1 что-то вроде userid, и Hello World будет чем-то вроде комментария. Я, вероятно, не буду публиковать SQL-инструкцию для этого канала, но вместо этого я могу использовать JSON как из JavaScript (JSON.stringify / JSON.parse), так и для PHP (json_encode / json_decode).

Обновить

Вы не запускаете cron-job, потому что это приведет к победе над проектом с pubsub Redis. Возьмем, к примеру, я посещаю ваш сайт, который является блогом в http://localhosts . Я прочитал статью по адресу 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 вы извлекаете данные, которые я разместил, и вставляем их в MySQL, используя INSERT INTO comments (1, "Hello World") . Когда эта мутация происходит, вам также необходимо сообщить node.js-процесс, который постоянно слушает канал 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 требует 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 , я также публикую эти изменения в redis. Эта часть важна! Процесс node.js всегда получает эти изменения благодаря pubsub Redis. Каждый раз, когда скрипт php мутирует базу данных, вы должны публиковать эти изменения в Redis с publish .

PS: Надеюсь, это понятно. Может быть, позже, когда у меня будет некоторое время, я обновляюсь, возможно, с небольшим фрагментом …