2009-05-25 15 views
11

मैं php के लिए नया हूं, लेकिन अन्य वेब प्रौद्योगिकियों में, आप पृष्ठ उदाहरणों के बीच वस्तुओं को साझा कर सकते हैं। उदाहरण के लिए, जावा जेएसपी पृष्ठों में आपके पास आसानी से कक्षा है जो पूरे सर्वर उदाहरण के लिए स्थिर वर्ग के रूप में मौजूद है। PHP में यह कैसे करें?क्या php पृष्ठों के बीच ऑब्जेक्ट साझा करने का कोई तरीका है?

मैं सत्र चर की चर्चा करते हुए नहीं कर रहा हूँ (कम से कम मुझे ऐसा नहीं लगता है)। यह संसाधन पूलिंग के उद्देश्य के लिए अधिक है (शायद साझा करने के लिए एक सॉकेट, या डेटाबेस कनेक्शन आदि)। इसलिए पूरे वर्ग को बाद के लोड के बीच साझा करने की आवश्यकता है, न केवल कुछ प्राचीन चर जो मैं सत्र में स्टोर कर सकता हूं।

मैं भी php सिंगलटन कक्षाओं कर में देखा है, लेकिन मुझे विश्वास है कि वर्ग केवल एक ही पृष्ठ के भीतर और पृष्ठों में नहीं साझा किया जाता है।

चीजों को और भी स्पष्ट करने के लिए, मैं कुछ ऐसा ढूंढ रहा हूं जो कनेक्ट करने में मदद कर सकता है, एक सॉकेट को connectSocket.php पेज के लिए सर्वर से कनेक्ट किया गया है, जैसे कि उस पृष्ठ को लोड करने वाले सभी उपयोगकर्ता एक ही सॉकेट का उपयोग करते हैं और एक नया नहीं खोलता है।

उत्तर

15

यह एक कठिन जवाब है, और शायद आप जो भी खोज रहे हैं वह शायद नहीं हो सकता है।

PHP 'साझा-कुछ नहीं' वास्तुकला पर बनाया गया है। अगर आपको अपने आवेदन में किसी प्रकार की स्थिति की आवश्यकता है, तो आपको इसे अन्य माध्यमों के माध्यम से करना होगा।

सबसे पहले मैं इस समस्या .. तुम सच में की जरूरत है के मूल में देख सिफारिश करेंगे? यदि आप मानते हैं कि PHP एप्लिकेशन मर सकता है (और राज्य खो सकता है) क्या डेटा खोना ठीक है?

आप, राज्य को बनाए रखने चाहिए के बाद भी आवेदन मर जाता है या अन्यथा, तो आप शायद डाल करने के लिए डेटा MySQL में है सबसे अच्छी जगह मान लेना चाहिए। PHP को आपके व्यावसायिक तर्क के चारों ओर एक पतली परत के रूप में लक्षित किया गया है, इसलिए मैं अत्यधिक अनुशंसा कर सकता हूं।

आप एक बार पुनः प्रारंभ करने डेटा को खोने के बारे में परवाह नहीं करते हैं, समस्या डोमेन आप देख रहे हैं शायद कैश कर रहा है। मैं memcached में देख रहा हूं या यदि आप एक मशीन पर हैं, apc। एपीसी निश्चित रूप से एक मशीन पर अपाचे के साथ आपके लिए काम करेगा, लेकिन आपको अभी भी अपने आवेदन को कोड करना होगा कि आप डेटा खो सकते हैं।

यदि आप चिंतित हैं कि आपका अंतर्निहित डेटास्टोर (MySQL) बहुत धीमा है, लेकिन फिर भी आपको पुनरारंभ करने के बाद डेटा को बनाए रखने की आवश्यकता है, तो आपको इन 2 सिस्टम के संयोजन को देखना चाहिए। आप हमेशा अपने डेटा को कैश से धक्का और खींच सकते हैं, लेकिन केवल तभी जब यह अपडेट माइस्क्ल पर भेजता है।

डेटा विशुद्ध रूप से उपयोगकर्ता या सत्र बाध्य है, तो आप शायद सिर्फ सत्र प्रणाली में देख करना चाहते हैं।

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

अद्यतन: क्षमा करें, मैंने सॉकेट साझा करने के बारे में आपका नोट नहीं पढ़ा। इसे संभालने के लिए आपको एक अलग डिमन की आवश्यकता होगी, शायद यदि आप अपनी समस्या को आगे समझा सकते हैं, तो अन्य दृष्टिकोण भी हो सकते हैं। यह किस प्रकार की सॉकेट है?

1

पीएचपी डेटाबेस पुस्तकालयों में से अधिकांश पहले से ही कनेक्शन पूलिंग का उपयोग करें। आप उदाहरण के लिए, कहते हैं, pg_connect के रूप में यदि आप एक नया कनेक्शन अनुरोध कर रहे थे, लेकिन अगर कनेक्शन स्ट्रिंग एक कनेक्शन पहले से मौजूद है के रूप में ही है, तो आप स्थापित कनेक्शन वापस बजाय मिल जाएगा। आप केवल डेटाबेस का उपयोग के लिए पूलिंग के बारे में परवाह है, तो आप सिर्फ इस बात की पुष्टि कर सकते हैं कि यह आप उपयोग कर रहे db पुस्तकालय में मौजूद है।

+1

हालांकि आपका उत्तर सही है, लेकिन अक्सर इन लगातार कनेक्शनों का उपयोग करने की अनुशंसा नहीं की जाती है। नए कनेक्शन बनाना अक्सर बहुत सस्ता होता है, और इसका मतलब है कि आपको उन सभी को लंबे समय तक नहीं रखना होगा। एक नियम के रूप में, जब मैं पहली क्वेरी कर रहा हूं तो मैं केवल डीबी से कनेक्ट होता हूं, और जैसे ही मैं कर सकता हूं उससे छुटकारा पाता हूं। डेटाबेस को स्केल करना कठिन होता है, PHP बहुत आसान है। – Evert

3

यह संभवतः आंशिक उत्तर है लेकिन आप कक्षा के एक सत्र को एक सत्र चर में सहेज सकते हैं और इसे किसी अन्य समय एक्सेस कर सकते हैं।

+3

दुर्भाग्य से यह खुले सॉकेट के साथ काम नहीं करेगा। – Evert

12

वेब-सेवारत जावा और वेब-सर्विसेज की व्याख्या की गई भाषाओं जैसे PHP और पर्ल के बीच एक मौलिक अंतर है। जावा में, आपके वेब सर्वर में एक ऑपरेटिंग वातावरण होगा जो राज्य को बनाए रखता है (यानी टोमकैट)। व्याख्या की गई भाषाओं के साथ, आपके वेब सर्वर के लिए अनुरोध आम तौर पर एक नया वेब सर्वर धागा उत्पन्न करेगा, जो बदले में उस धागे के लिए एक नया ऑपरेटिंग वातावरण लोड करता है, इस मामले में, PHP वातावरण।

इसलिए, PHP में, पृष्ठ के उदाहरणों की कोई अवधारणा नहीं है। वेब सर्वर के लिए हर अनुरोध एक ताजा शुरुआत है। सभी वर्गों को फिर से लोड किया जाता है, इसलिए वर्ग साझा करने की कोई अवधारणा नहीं है, न ही संसाधन पूलिंग की एक अवधारणा है, जब तक कि इसे बाहरी रूप से लागू नहीं किया जाता है।

इसलिए वेब अनुरोधों के बीच सॉकेट साझा करना वास्तव में संभव नहीं है।

+0

सच नहीं है, memcache के बारे में क्या? – Pacerier

0

ऑब्जेक्ट के डेटा को किसी भी $ _SESSION चर में लोड करने के लिए एक अन्य डरावना समाधान हो सकता है और उसके बाद इसे दूसरे पृष्ठ के ऑब्जेक्ट में वापस ले जाया जा सकता है। असल में, यह वह समाधान है जिसे मैं अपने प्रोजेक्ट में पालन करने जा रहा हूं, जब तक कि मुझे कुछ बेहतर न हो।

सम्मान!

संबंधित मुद्दे

 संबंधित मुद्दे