Ответ 1
Вариант 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).
Update
Вы не запускаете 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>
Я отправляю форму с атрибутом действия 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 с 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 всегда получает эти изменения благодаря Redis pubsub. Каждый раз, когда PHP скрипт мутирует базу данных, вы должны публиковать эти изменения в Redis с помощью publish
.
P.S: Надеюсь, это ясно. Может быть, позже, когда у меня будет некоторое время, я обновляюсь, возможно, с небольшим фрагментом...