Möglichkeit 3
Wenn Sie MySQL von PHP aus aktualisieren, veröffentlichen Sie diese Änderungen in node.js über redis publish
Befehl (von PHP veröffentlichen, wenn die Datenbank verändert wird). Von node.js würde ich diese Änderungen dank Redis' Abonnement in Echtzeit erhalten. Dann würde ich sie einfach über socket.io an interessierte Benutzer übertragen. Sie könnten zum Beispiel publish
um mysql
zu kanalisieren . Nehmen Sie zum Beispiel die folgende SQL-Anweisung => INSERT INTO comments (1, "Hello World")
. Wobei 1
ist so etwas wie userid und Hello World
wäre so etwas wie der Kommentar. Ich würde wahrscheinlich keine SQL-Anweisung in diesem Kanal veröffentlichen, sondern stattdessen JSON, das ich problemlos sowohl von JavaScript (JSON.stringify / JSON.parse) als auch von PHP (json_encode / json_decode) verwenden kann.
Aktualisieren
Sie führen keinen Cron-Job aus, da dies den Zweck von Redis 'Pubsub zunichte machen würde. Nehmen wir zum Beispiel, ich besuche Ihre Website, die ein Blog unter http://localhosts
ist . Ich habe einen Artikel unter http://localhost.com/a.php
gelesen . Unten auf der Website stellen Sie ein Formular bereit, das ich verwenden kann, um einen Kommentar zu diesem Artikel abzugeben:
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>
Ich sende das Formular mit dem Aktionsattribut http://localhost/postcomment.php
. Aber das ist der wichtige Teil! Unter post.php
Sie rufen die von mir geposteten Daten ab und fügen sie mit INSERT INTO comments (1, "Hello World")
in MySQL ein . Wenn diese Mutation auftritt, müssen Sie auch den node.js-Prozess informieren, der ständig auf Kanal mysql
lauscht :
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 erfordert Prädis.
Der Knotencode mit node_redis würde etwa so aussehen:
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');
Dieses Beispiel hängt von den folgenden Paketen ab, die Sie über npm
installieren könnennpm install socket.io
npm install redis
npm install express
Immer wenn ich das Formular poste post.php
, veröffentliche ich diese Änderungen auch in redis. Dieser Teil ist wichtig! Der node.js-Prozess empfängt diese Änderungen dank Pubsub von Redis immer. Jedes Mal, wenn ein PHP-Skript die Datenbank verändert, sollten Sie diese Änderungen mit publish
in Redis veröffentlichen .
P.S.:Ich hoffe, das ist klar. Vielleicht später, wenn ich etwas Zeit habe, aktualisiere ich mit vielleicht einem kleinen Ausschnitt...