विकल्प 3
जब आप PHP से MySQL को अपडेट करते हैं तो आप उन परिवर्तनों को redis publish
के माध्यम से node.js में प्रकाशित करते हैं कमांड (डेटाबेस को बदलते समय PHP से प्रकाशित करें)। नोड.जेएस से मुझे रेडिस की सदस्यता के लिए वास्तविक समय में वे परिवर्तन प्राप्त होंगे। तब मैं उन्हें केवल socket.io के माध्यम से रुचि रखने वाले उपयोगकर्ताओं को प्रसारित करूंगा। उदाहरण के लिए आप publish
. कर सकते हैं चैनल के लिए mysql
. उदाहरण के लिए निम्न SQL कथन लें => INSERT INTO comments (1, "Hello World")
. जहां 1
उपयोगकर्ता आईडी, और Hello World
. जैसा कुछ है टिप्पणी की तरह कुछ होगा। मैं शायद उस चैनल पर एसक्यूएल-स्टेटमेंट प्रकाशित नहीं करूंगा, लेकिन जेएसओएन जिसके बजाय मैं आसानी से जावास्क्रिप्ट (JSON.stringify / JSON.parse) और PHP (json_encode / json_decode) दोनों का उपयोग कर सकता हूं।
अपडेट करें
आप क्रॉन-जॉब नहीं चलाते क्योंकि यह रेडिस के पबब के उद्देश्य को हरा देगा। उदाहरण के लिए मैं आपकी वेबसाइट पर जाता हूं जो 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
. पर आप मेरे द्वारा पोस्ट किए गए डेटा को पुनः प्राप्त करते हैं और इसे INSERT INTO comments (1, "Hello World")
का उपयोग करके MySQL में डालते हैं। . जब यह उत्परिवर्तन होता है तो आपको नोड.जेएस प्रक्रिया को सूचित करने की भी आवश्यकता होती है जो लगातार चैनल को सुन रही है 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 की आवश्यकता है।
नोड_रेडिस वाला नोड कोड कुछ इस तरह दिखेगा:
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
, मैं इन परिवर्तनों को रेडिस में भी प्रकाशित करता हूं। यह हिस्सा महत्वपूर्ण है! नोड.जेएस प्रक्रिया हमेशा रेडिस के पबसब के लिए उन परिवर्तनों को प्राप्त कर रही है। हर बार जब कोई php स्क्रिप्ट डेटाबेस को बदलता है तो आपको इन परिवर्तनों को Redis में publish
के साथ प्रकाशित करना चाहिए ।
पुनश्च:आशा है कि यह स्पष्ट है। हो सकता है बाद में जब मेरे पास कुछ समय उपलब्ध हो तो मैं शायद थोड़ा सा स्निपेट के साथ अपडेट करता हूं...