Tùy chọn 3
Khi bạn cập nhật MySQL từ PHP, bạn xuất bản những thay đổi đó lên node.js thông qua redis publish
lệnh (xuất bản từ PHP khi đột biến cơ sở dữ liệu). Từ node.js, tôi sẽ nhận được những thay đổi đó trong thời gian thực nhờ đăng ký của Redis. Sau đó, tôi sẽ chỉ phát chúng cho những người dùng quan tâm thông qua socket.io. Ví dụ, bạn có thể publish
tới kênh mysql
. Lấy ví dụ câu lệnh SQL sau => INSERT INTO comments (1, "Hello World")
. Ở đâu 1
giống như userid và Hello World
sẽ là một cái gì đó giống như nhận xét. Tôi có thể sẽ không xuất bản câu lệnh SQL cho kênh đó mà thay vào đó là JSON mà tôi có thể dễ dàng sử dụng cả từ JavaScript (JSON.stringify / JSON.parse) và PHP (json_encode / json_decode).
Cập nhật
Bạn không chạy một công việc cron-job vì điều này sẽ đánh bại mục đích của pubsub của Redis. Lấy ví dụ tôi truy cập trang web của bạn là một blog tại http://localhosts
. Tôi đọc một bài báo tại http://localhost.com/a.php
. Dưới đây, trên trang web, bạn cung cấp một biểu mẫu mà tôi có thể sử dụng để đăng nhận xét cho bài viết đó:
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>
Tôi gửi biểu mẫu có thuộc tính action http://localhost/postcomment.php
. Nhưng đây là phần quan trọng! Tại post.php
bạn truy xuất dữ liệu tôi đã đăng và chèn nó vào MySQL bằng cách sử dụng INSERT INTO comments (1, "Hello World")
. Khi đột biến này xảy ra, bạn cũng cần thông báo cho quá trình node.js đang liên tục lắng nghe kênh 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 yêu cầu tiền định trước.
Mã nút với node_redis sẽ trông giống như sau:
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');
Các mẫu này phụ thuộc vào các gói sau mà bạn có thể cài đặt qua npm
npm install socket.io
npm install redis
npm install express
Luôn luôn khi tôi đăng biểu mẫu post.php
, Tôi cũng xuất bản những thay đổi này lên redis. Phần này là quan trọng! Quá trình node.js luôn nhận được những thay đổi đó nhờ pubsub của Redis. Mỗi khi tập lệnh php thay đổi cơ sở dữ liệu, bạn nên xuất bản những thay đổi này lên Redis với publish
.
P.S:Hy vọng điều này rõ ràng. Có lẽ sau này khi rảnh rỗi, tôi sẽ cập nhật đoạn mã có thể là ...