2013-05-10 13 views
7

के बीच संवाद करने के लिए रेडिस का उपयोग करना मेरे पास स्थिर संसाधनों की सेवा के लिए एक रिवर्स प्रॉक्सी के रूप में Nginx का उपयोग करके, एक PHP एप बनाया गया है और अपाचे पर चल रहा है।PHP और socket.io/node.js

मेरे पास रेडिस भी स्थापित है जिसे मैं प्रत्येक उपयोगकर्ता गतिविधि स्ट्रीम के लिए गतिविधि आईडी स्टोर करने के लिए उपयोग कर रहा हूं। गतिविधि को MySQL डेटाबेस में लिखा जाता है, फिर Redis प्रत्येक उपयोगकर्ता स्ट्रीम में गतिविधि आईडी को धक्का देता है। जब कोई उपयोगकर्ता अपनी गतिविधि स्ट्रीम प्राप्त करता है, तो ऐप पहले Redis से गतिविधि आईडी की उपयोगकर्ताओं की सूची पुनर्प्राप्त करता है और उसके बाद वास्तविक गतिविधि डेटा को MySQL IN() क्वेरी के माध्यम से प्राप्त करता है।

यह सब बहुत अच्छी तरह से काम करता है, हालांकि मैं इस सेट अप करने के लिए वास्तविक समय क्षमता जोड़ना चाहता हूं। मैं इन घटनाओं को सीधे उपयोगकर्ता ब्राउज़र पर धक्का दे सकता हूं और सामान्य लाइव नोटिफिकेशन भी जोड़ सकता हूं।

इसके लिए मैंने socket.io के साथ node.js स्थापित किया है। मेरे पास socket.io सर्वर सही ढंग से ऊपर और चल रहा है और क्लाइंट स्वचालित रूप से पेज लोड पर जुड़ा हुआ है।

जहां मैं संघर्ष कर रहा हूं यह समझने में है कि मेरे PHP ऐप से socket.io को संदेश कैसे पोस्ट करें। चूंकि PHP और node.js सीधे संवाद नहीं कर सकते हैं, मेरी समझ यह है कि मैं रेडिस को एक बीच के रूप में उपयोग करने से सबसे अच्छा होगा क्योंकि मैंने पहले ही इसे स्थापित और ऊपर और चलाया है। हालांकि मुझे नहीं पता कि इस बारे में कैसे जाना है।

मुझे जो चाहिए वह प्रक्रिया का विवरण है (किसी भी कोड उदाहरण PHP से Redis तक अधिसूचना भेजने के लिए और फिर socket.io में प्रासंगिक क्लाइंट को धक्का देने के लिए)।

इसके अलावा, मुझे नहीं पता कि socket.io कैसे पता चलेगा कि कौन सा क्लाइंट भेजना है। मैं इस जानकारी को कैसे पास करूँगा और सबकुछ सिंक करूँगा? क्या यह भी जरूरी है? क्या मुझे अपने PHP सत्रों को रेडिस में स्टोर करने की आवश्यकता है और जब कोई उपयोगकर्ता कनेक्ट होता है तो socket.io डेटा एकत्र करता है? क्या कोई और तरीका है?

अग्रिम धन्यवाद।

कृपया ध्यान दें: मेरा PHP सत्र डेटा वर्तमान में डिस्क पर सहेजा गया है।

+0

कैसे redis पर एक pubsub चैनल होने, और अपने Node.js प्रक्रिया से इसे करने के लिए सदस्यता लेने के बारे। तब आपका PHP नोड पर संवाद करने के लिए पबूब पर प्रकाशित होगा। आप अलग-अलग ग्राहकों के लिए अलग-अलग पबब चैनल रख सकते हैं और अपने विशिष्ट ग्राहकों तक पहुंचने के लिए आवश्यक चैनलों को प्रकाशित कर सकते हैं। – akonsu

+0

@akonsu यह वही है जो मैंने धन्यवाद करने के लिए समाप्त किया। हालांकि मैंने केवल एक ही पबब चैनल स्थापित किया है और इसे सब कुछ प्रकाशित करने के लिए बस इसे socket.io में प्राप्त करने के लिए प्रकाशित किया है। वहां मैं काम करता हूं कि कौन सा विशिष्ट ग्राहक इसे आदि जाना चाहिए ... क्या मैं प्रत्येक जुड़े क्लाइंट के लिए एक अलग पबब चैनल को परिभाषित करने से बेहतर होगा? इसके अलावा यदि आप इसे लिखना चाहते हैं तो मैं एक उत्तर के रूप में अधिक जानकारी देता हूं, मैं इसे सही चिह्नित करूंगा। :) – gordyr

+0

ईमानदारी से, मैं प्रत्येक उपयोगकर्ता के लिए एक अलग चैनल बनाने के बारे में नहीं जानता।यह उपयोगकर्ताओं की संख्या पर निर्भर करता है। यह पैमाने पर नहीं हो सकता है। लेकिन मैं निश्चित रूप से कई चैनल होने की संभावना को ध्यान में रखता हूं। एक दिन जब आपका उपयोगकर्ता आधार बढ़ता है, तो आपके पास कई संबंधित रेडिस उदाहरण हो सकते हैं और आपके चैनलों को उनके पास दिखाया जा सकता है। – akonsu

उत्तर

1

आप रेडिस पर एक पबब चैनल स्थापित कर सकते हैं (कृपया http://redis.io/topics/pubsub देखें)। फिर अपने node.js प्रक्रिया से इसकी सदस्यता लें। तब आपका PHP नोड पर संवाद करने के लिए पबूब पर प्रकाशित होगा। आप अलग-अलग ग्राहकों के लिए अलग-अलग पबब चैनल रख सकते हैं और अपने विशिष्ट ग्राहकों तक पहुंचने के लिए आवश्यक चैनलों को प्रकाशित कर सकते हैं।

+2

कृपया इसे स्पष्ट करने के लिए एक स्रोत लिंक संलग्न करें ... – tong

+0

धन्यवाद। एक लिंक जोड़ा गया। – akonsu

0

रेडिस इनबिल्ट वेबसाईट या http सर्वर की पेशकश नहीं करता है, इसलिए हमें चैनल डेटा स्ट्रीम करने के लिए इसे php या node.js के साथ एकीकृत करना होगा। ट्वीक विधि के साथ, हम Redis सर्वर को रेडिस के लिए predis php लाइब्रेरी का उपयोग करके php के साथ कनेक्ट कर सकते हैं, जहां php डेटा को Redis में धक्का देगी और socket.io Redis सेवर में धक्का दिए गए नए संदेशों का ट्रैक रखेगा और इसे वास्तविक रूप से उससे जुड़े उपयोगकर्ताओं को वापस ले जाएगा पहर।

https://github.com/u-day/tweak/