开始在一个新项目上工作,使用redis作为子/发布系统来显示mysql数据库的结果。因此,如果有更新,我想从mysql发布这些更新到我的网页。我的问题是,哪个选择更好?
选项1:我应该通过nodejs和socket。io来完成所有这些吗?意思是创建一个连接到redis的nodejs脚本,订阅我需要收听的频道,在nodejs中使用mysql查询数据库更新,如果更新发布mysql行,那么在html中通过套接字连接到nodejs。IO获取新数据并处理它以显示结果?
选项2:有一个php脚本查询mysql和redis-php客户端发布任何更新到通道?不知道从这里还需要设置什么。我还需要有nodejs参与这个选项吗?
或者我只是基于这一切是如何工作的?最重要的是我想通过mysql数据库显示使用redis sub/pub功能的用户的结果。
选项3
当你从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)
你不运行一个cron-job,因为这会破坏Redis的publish - sub的目的。举个例子,我访问了你的网站,这是一个在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
中,您检索我发布的数据并使用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 PredisClient();
$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脚本改变数据库时,你应该用publish
将这些变化发布到Redis。
p。S:希望你讲清楚了。也许以后当我有一些时间,我更新也许小片段…