2008-11-01 9 views
9

काम पर हम जावा और पर्ल में लगभग हर चीज करते हैं, लेकिन मैं PHP और सत्रों का उपयोग करके एक सुविधा बनाना चाहता था। कुछ झुंडों ने सोचा कि हमारे सिस्टम पर PHP सत्र करने का प्रयास करना एक बुरा विचार था, क्योंकि यह कई सर्वरों को वितरित किया गया है। विशिष्ट समस्या क्या होगी?क्या PHP सत्र एक वितरित सिस्टम में स्केल करना कठिन है?

उत्तर

4

आपके विशिष्ट प्रश्न का उत्तर, समस्या क्या होगी, इस तथ्य में निहित है कि डिफ़ॉल्ट रूप से PHP फाइलों को फाइल सिस्टम पर फाइलों में संग्रहीत करता है। एक वेबसर्वर सेवारत अनुरोधों के लिए, यह कोई समस्या नहीं है क्योंकि आपका सत्र डेटा हमेशा उपलब्ध रहेगा। लेकिन क्या होगा यदि आपके पास दो लोड-संतुलित वेबसर्वर अनुरोधों की सेवा कर रहे हों?

कल्पना के साथ पहला वेबसर्वर मारने की कल्पना करें, जो आपकी फ़ाइल फ़ाइल पर अपनी सत्र फ़ाइल बनाता है। फिर, आपका अगला अनुरोध दूसरे वेबसर्वर को हिट करता है। दूसरा वेबसर्वर निश्चित रूप से सत्र फ़ाइल नहीं देखेगा। उपयोगकर्ता के लिए, आप किसी वेबसाइट पर लॉग इन कर सकते हैं, और फिर अचानक लॉग आउट हो जाएं।

यह PHP के लिए विशिष्ट समस्या नहीं है, और यह बहुत आम है। समाधान कुछ सामान्य क्षेत्र में सत्र डेटा स्टोर करना है। इसके लिए सबसे आम तरीका सत्र डेटा को सभी वेब सर्वरों के लिए सुलभ डेटाबेस में संग्रहीत करना है, या कुछ साझा मेमोरी कैश सर्वर जैसे memcached।

+0

जैसा कि @azkotoki नीचे उल्लेखित है, NAS- समर्थित एनएफएस माउंट जैसे साझा विभाजन भी अच्छी तरह से काम करता है। इसके बारे में अच्छी बात यह है कि इसमें कोड परिवर्तन शामिल नहीं हैं। बस स्थानीय सत्र निर्देशिका को एनएफएस में सिमलिंक करें। – gerard

+0

लेकिन क्या होगा यदि डोमेन अलग डेटासेंटर में हैं? – Dannyboy

4

कई सर्वरों (जिसे सत्र क्लस्टरिंग के रूप में भी जाना जाता है) में सत्र सत्र वेब अनुप्रयोगों को स्केल करने के लिए एक आम समस्या है, और यह PHP के लिए विशिष्ट नहीं है। PHP इसे संभालने के लिए कई समाधान प्रदान करता है, जैसे Zend Platform (वाणिज्यिक एप्लिकेशन सर्वर), और Msession (एक्सटेंशन)।

http://www.php.net/manual/en/function.session-set-save-handler.php

मैंने कभी यह प्रयास नहीं किया है, लेकिन इसके साथ आप को परिभाषित अपने खुद के बचाने के लिए, कार्यों पढ़ने/ताकि आप एक डेटाबेस लागू कर सकते हैं या:

10

तुम भी हैंडलर बचाने के लिए एक कस्टम सत्र इस्तेमाल कर सकते हैं किसी भी एक्सटेंशन को स्थापित करने की आवश्यकता के बिना एक साझा nfs बैकएंड।

इसके अलावा, @Eran Galperin द्वारा सुझाए गए मसेशन, मैंने पहले उल्लेख किए गए विकल्प के रूप में बहुत ही रोचक लग रहा है।

+0

यह एक बढ़िया जवाब है, और मैं इस दृष्टिकोण का उपयोग किया जाएगा। धन्यवाद! – woody121

0

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

  • यदि आप कुकीज़ को किसी अन्य होस्ट पर डाल रहे हैं, तो यह आपकी कुकीज़ की गति को कैसे प्रभावित करेगा? यह स्पष्ट रूप से इस बात पर निर्भर करता है कि आप कितने लिखते हैं/पढ़ते हैं।
  • क्या आप गति बढ़ाने या विफलता पाने के लिए ऐसा कर रहे हैं? जवाब निश्चित रूप से विभिन्न समाधानों का कारण बन जाएगा:
    • यदि आप विफलता के लिए ऐसा कर रहे हैं, तो आप कैसे प्रबंधित करेंगे यदि आपका वेबसर्वर आपके सत्र स्टोर तक नहीं पहुंच सकता है क्योंकि नेटवर्क लिंक डाउन हो जाता है? क्या होगा यदि आपका सत्र स्टोर नीचे चला जाता है? आपको किसी भी प्रकार के मास्टर-मास्टर प्रतिकृति का उपयोग करके इसे हल करना होगा, संभवतः उसी मशीन पर वितरित सत्र स्टोर को अतिरिक्त उच्च उपलब्धता के लिए वेबसर्वर के रूप में चलाया जाना चाहिए (यदि सभी सत्र स्मृति में फिट हो सकते हैं)। Riak पर एक नज़र डालें या मास्टर-मास्टर प्रतिकृति के लिए समान देखें।
    • यदि आप बस इसे गति के लिए कर रहे हैं, तो मैं क्लाइंट आईपी पते के आधार पर लोड संतुलन करने के लिए अपाचे, nginx या (सबसे तेज़) haproxy का उपयोग करूंगा। इस तरह आपको वितरित सत्र स्टोर स्थापित करने से परेशान नहीं होना पड़ेगा। निश्चित रूप से, यदि आपके PHP-उदाहरणों में से एक नीचे चला जाता है तो आपके उपयोगकर्ता अपनी कुकीज़ खो देंगे, लेकिन हो सकता है कि यह कोई समस्या न हो। यह आप पर निर्भर करता है।
संबंधित मुद्दे