Opsi 3
Saat Anda memperbarui MySQL dari PHP, Anda memublikasikan perubahan tersebut ke node.js melalui redis publish
perintah (terbitkan dari PHP saat mengubah basis data). Dari node.js saya akan menerima perubahan itu secara real-time berkat berlangganan Redis. Kemudian saya hanya akan menyiarkannya kepada pengguna yang tertarik melalui socket.io. Anda dapat misalnya publish
untuk menyalurkan mysql
. Ambil contoh pernyataan SQL berikut => INSERT INTO comments (1, "Hello World")
. Dimana 1
adalah sesuatu seperti userid, dan Hello World
akan menjadi sesuatu seperti komentar. Saya mungkin tidak akan mempublikasikan pernyataan SQL ke saluran itu, tetapi JSON yang dapat saya gunakan dengan mudah baik dari JavaScript(JSON.stringify / JSON.parse) dan PHP(json_encode / json_decode).
Perbarui
Anda tidak menjalankan cron-job karena ini akan mengalahkan tujuan dari pubsub Redis. Ambil contoh saya mengunjungi situs web Anda yang merupakan blog di http://localhosts
. Saya membaca artikel di http://localhost.com/a.php
. Di bawah ini di situs Anda menyediakan formulir yang dapat saya gunakan untuk mengirim komentar ke artikel itu:
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>
Saya mengirimkan formulir yang memiliki atribut tindakan http://localhost/postcomment.php
. Tapi ini adalah bagian yang penting! Di post.php
Anda mengambil data yang saya posting dan memasukkannya ke MySQL menggunakan INSERT INTO comments (1, "Hello World")
. Ketika mutasi ini terjadi, Anda juga perlu menginformasikan proses node.js yang terus mendengarkan saluran 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 membutuhkan predis.
Kode simpul dengan node_redis akan terlihat seperti:
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');
Contoh ini bergantung pada paket berikut, yang dapat Anda instal melalui npm
npm install socket.io
npm install redis
npm install express
Selalu ketika saya memposting formulir post.php
, saya juga memublikasikan perubahan ini ke redis. Bagian ini penting! Proses node.js selalu menerima perubahan tersebut berkat pubsub Redis. Setiap kali skrip php mengubah database, Anda harus memublikasikan perubahan ini ke Redis dengan publish
.
P.S:Semoga ini jelas. Mungkin nanti ketika saya punya waktu, saya memperbarui dengan mungkin sedikit cuplikan...