Optie 3
Wanneer u MySQL bijwerkt vanuit PHP, publiceert u die wijzigingen naar node.js via redis publish
command (publiceer vanuit PHP bij het muteren van de database). Van node.js zou ik die wijzigingen in realtime ontvangen dankzij het abonnement van Redis. Dan zou ik ze gewoon uitzenden naar geïnteresseerde gebruikers via socket.io. U kunt bijvoorbeeld publish
naar kanaal mysql
. Neem bijvoorbeeld de volgende SQL-instructie => INSERT INTO comments (1, "Hello World")
. Waar 1
is zoiets als userid, en Hello World
zou zoiets zijn als de opmerking. Ik zou waarschijnlijk geen SQL-statement op dat kanaal publiceren, maar in plaats daarvan JSON die ik gemakkelijk kan gebruiken vanuit zowel JavaScript (JSON.stringify / JSON.parse) als PHP (json_encode / json_decode).
Bijwerken
Je voert geen cron-job uit omdat dit het doel van Redis' pubsub teniet zou doen. Neem bijvoorbeeld ik bezoek uw website die een blog is op http://localhosts
. Ik las een artikel op http://localhost.com/a.php
. Hieronder op de site geeft u een formulier dat ik kan gebruiken om een reactie op dat artikel te plaatsen:
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>
Ik dien het formulier in met het actiekenmerk http://localhost/postcomment.php
. Maar dit is het belangrijkste! Op post.php
je haalt de gegevens op die ik heb gepost en voegt deze in MySQL met behulp van INSERT INTO comments (1, "Hello World")
. Wanneer deze mutatie plaatsvindt, moet u ook het node.js-proces informeren dat voortdurend luistert naar kanaal 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 vereist predis.
De knooppuntcode met node_redis zou er ongeveer zo uitzien:
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');
Deze voorbeelden zijn afhankelijk van de volgende pakketten, die u via npm kunt installeren
npm install socket.io
npm install redis
npm install express
Altijd als ik het formulier post.php
plaats , publiceer ik deze wijzigingen ook in redis. Dit onderdeel is belangrijk! Het node.js-proces ontvangt die wijzigingen altijd dankzij de pubsub van Redis. Elke keer dat een php-script de database muteert, moet u deze wijzigingen naar Redis publiceren met publish
.
P.S:Ik hoop dat dit duidelijk is. Misschien later, als ik wat tijd over heb, update ik met misschien een klein fragment...