आप ZeroMQ का उपयोग करके इस समस्या को हल कर सकते हैं।
ज़ीरोएमक्यू एक ऐसी लाइब्रेरी है जो चीजों (धागे, प्रक्रियाओं और यहां तक कि अलग मशीनों) को एक साथ जोड़ने के लिए सुपरचार्ज किए गए सॉकेट प्रदान करती है।
मैं तुम्हें ग्राहक के लिए सर्वर से डेटा पुश करने के लिए कोशिश कर रहे हैं मान। ठीक है, ऐसा करने के लिए एक अच्छा तरीका EventSource API (polyfills available) का उपयोग कर रहा है।
client.js
EventSource के माध्यम से stream.php को जोड़ता है।
var stream = new EventSource('stream.php');
stream.addEventListener('debug', function (event) {
var data = JSON.parse(event.data);
console.log([event.type, data]);
});
stream.addEventListener('message', function (event) {
var data = JSON.parse(event.data);
console.log([event.type, data]);
});
router.php
यह एक लंबी चलने वाली प्रक्रिया है कि भेजे गए संदेशों के लिए सुनता है और कोई सुन रहा करने के लिए उन्हें बाहर भेजता है।
<?php
$context = new ZMQContext();
$pull = $context->getSocket(ZMQ::SOCKET_PULL);
$pull->bind("tcp://*:5555");
$pub = $context->getSocket(ZMQ::SOCKET_PUB);
$pub->bind("tcp://*:5556");
while (true) {
$msg = $pull->recv();
echo "publishing received message $msg\n";
$pub->send($msg);
}
stream.php
साइट को कनेक्ट करने प्रत्येक उपयोगकर्ता अपने ही stream.php हो जाता है। यह स्क्रिप्ट लंबी दौड़ रही है और राउटर से किसी भी संदेश की प्रतीक्षा कर रही है। एक बार यह एक नया संदेश प्राप्त हो जाने पर, यह इवेंटसोर्स प्रारूप में इस संदेश को आउटपुट करेगा।
<?php
$context = new ZMQContext();
$sock = $context->getSocket(ZMQ::SOCKET_SUB);
$sock->setSockOpt(ZMQ::SOCKOPT_SUBSCRIBE, "");
$sock->connect("tcp://127.0.0.1:5556");
set_time_limit(0);
ini_set('memory_limit', '512M');
header("Content-Type: text/event-stream");
header("Cache-Control: no-cache");
while (true) {
$msg = $sock->recv();
$event = json_decode($msg, true);
if (isset($event['type'])) {
echo "event: {$event['type']}\n";
}
$data = json_encode($event['data']);
echo "data: $data\n\n";
ob_flush();
flush();
}
सभी उपयोगकर्ताओं को संदेश भेजने के लिए, बस उन्हें राउटर पर भेजें। राउटर तब उस संदेश को सभी सुनने वाली धाराओं में वितरित करेगा। यहां एक उदाहरण दिया गया है:
<?php
$context = new ZMQContext();
$sock = $context->getSocket(ZMQ::SOCKET_PUSH);
$sock->connect("tcp://127.0.0.1:5555");
$msg = json_encode(array('type' => 'debug', 'data' => array('foo', 'bar', 'baz')));
$sock->send($msg);
$msg = json_encode(array('data' => array('foo', 'bar', 'baz')));
$sock->send($msg);
यह साबित करना चाहिए कि आपको रीयलटाइम प्रोग्रामिंग करने के लिए node.js की आवश्यकता नहीं है। PHP इसे ठीक से संभाल सकता है।
इसके अलावा, socket.io ऐसा करने का एक बहुत अच्छा तरीका है। और आप आसानी से ZeroMQ के माध्यम से अपने PHP कोड में socket.io से कनेक्ट कर सकते हैं।
भी
आप प्राप्त करने के लिए कोशिश कर रहे हैं? सामान्य तरीका यह है कि ग्राहक परिवर्तनों की जांच के लिए समय-समय पर स्क्रिप्ट को कॉल करें। क्या कोई कारण है कि आप इसे सर्वर-साइड क्यों करना चाहते हैं? – JJJ
PHP वास्तव में ऐसी भाषा नहीं है जिसका उपयोग आपको कॉमेट के लिए करना चाहिए। नोड का प्रयोग करें।जेएस या कुछ और जो असीमित रूप से काम करता है (उदाहरण के लिए पायथन टॉरनाडो या ग्रीनलेट)। थ्रेड/प्रोसेस-आधारित वेबसर्वर पर चल रहे PHP का उपयोग करके आपके पास एक विशाल ओवरहेड है। – ThiefMaster
@ जुहाना, कारण परिवर्तन के लिए आवधिक जांच से बचने का कारण है और 'रिवर्स-एजेक्स' समाधान है। @thiefMaster मैं जानता हूँ कि वहाँ वहाँ कुछ कोमेट सर्वर समाधान कर रहे हैं, लेकिन मैं सच में लगता है कि एक php बैकएंड संभव हो सकता है, और जब तक मैं PHP में अपने व्यवसाय लॉगिन बारे में यह वास्तव में बेहतर कोई अन्य भाषा से परहेज कोड में में पुनर्लेखन के लिए नहीं होगा दोहराव। क्या आप कृपया मुझे समझा सकते हैं कि क्यों एक PHP धूमकेतु बैकएंड ओवरहेडिंग होगा? – ArtoAle