开始使用redis作为sub / pub系统在新项目上工作,以显示mysql数据库的结果。因此,如果有更新,我想将这些更新从mysql发布到我的网页。我的问题是,哪种选择更好?
选项1:是否应该仅通过nodejs和socket.io完成所有这些工作?意思是创建一个连接到redis的nodejs脚本,订阅我需要收听的频道,在nodejs中使用mysql查询数据库以获取更新,如果更新发布了mysql行,则在通过socket.io连接到nodejs的html中获取新数据并对其进行处理以显示结果?
选项2:是否有一个php脚本查询mysql,并使用redis- php客户端向该频道发布了任何更新?不知道从这里确切还需要设置什么。我仍然需要让nodejs参与此选项吗?
还是我只是基于所有这些工作原理?最重要的是,我想使用redis sub / pub功能通过mysql数据库向用户显示结果。
当您从PHP更新MySQL时,您会通过redis publish命令将这些更改发布到node.js (在数据库突变时从PHP发布)。由于Redis的订阅,我可以从node.js实时收到这些更改。然后,我将它们通过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)轻松使用。
publish
mysql
INSERT INTO comments (1, "Hello World")
1
Hello World
您不会执行Cron作业,因为这会破坏Redis pubpub的目标。以我访问您的网站为例,该网站是的博客http://localhosts。我在阅读了一篇文章http://localhost.com/a.php。在网站下方,您提供了一个表格,我可以使用该表格对该文章发表评论:
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检索我发布的数据时,使用将其插入MySQL INSERT INTO comments (1, "Hello World")。当发生这种突变时,您还需要通知不断监听channel的node.js进程mysql:
http://localhost/postcomment.php
post.php
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 publish。
PS:希望这很清楚。 也许稍后,当我有空的时候,我可能会更新一些代码段…