Redis子/ pub和php / nodejs

开始使用redis作为子/ pub系统来显示mysql数据库结果的新项目。 所以如果有更新,我想从mysql发布这些更新到我的网页。 我的问题是,哪个选项会更好?

选项1:我应该通过nodejs和socket.io来做所有的事吗? 这意味着创build一个连接到redis的nodejs脚本,订阅我需要监听的通道,在nodejs中使用mysql查询db的更新,如果更新发布mysql行,然后在通过socket.io连接到nodejs的html中获取新的数据和它的过程来显示结果?

选项2:有一个PHP脚本查询MySQL和Redis的PHP客户端发布的任何更新通道? 不知道还有什么需要从这里设置。 我仍然需要在这个选项中包含nodejs?

或者我只是基于这一切如何工作? 底线是我想通过mysql数据库显示结果给用户使用redis sub / pubfunction。

选项3

当您从PHP更新MySQL时,您可以通过redis publish命令(在变更数据库时从PHP发布)将这些更改发布到node.js。 从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-job,因为这会打破Redis的pubsub的目的。 举个例子,我访问你的网站,这是一个博客在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> 

我提交了具有action属性http://localhost/postcomment.php的表单。 但这是重要的一部分! 在post.php你检索我发布的数据,并使用INSERT INTO comments (1, "Hello World")将其插入到MySQL中。 当这个变异发生的时候,你还需要通知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。 这部分很重要! 由于Redis的pubsub,node.js进程总是接收这些更改。 每次当一个php脚本改变数据库时,你应该把这些改变发布到Redis上。

PS:希望这是明确的。 也许以后,当我有一些可用的时间我更新可能小片段…