मेरे पास एक मल्टीप्लेयर सर्वर है जो PHPSockets का उपयोग कर रहा है, और इस प्रकार पूरी तरह से PHP में लिखा गया है।क्या स्क्रिप्ट चल रहा है, तो गतिशील रूप से PHP कोड को फिर से लोड करना संभव है?
वर्तमान में, जब भी मैं PHP सर्वर-स्क्रिप्ट में कोई भी परिवर्तन कर रहा हूं, मुझे स्क्रिप्ट को मारना होगा और फिर इसे फिर से शुरू करना होगा। इसका मतलब है कि ऑनलाइन कोई भी उपयोगकर्ता डिस्कनेक्ट हो जाता है (आमतौर पर कोई समस्या नहीं है क्योंकि इस समय बहुत सारे नहीं हैं)।
अब मैं कस्टम PHP कक्षाओं का उपयोग करने के लिए सर्वर-स्क्रिप्ट को फिर से लिख रहा हूं और चीजों को थोड़ा सा हल करता हूं (आप नहीं जानना चाहते कि यह आज कितना बुरा दिखता है)। आज मैं सोच रहा था: "क्या पूरे स्क्रिप्ट को पुनरारंभ किए बिना php स्रोत में परिवर्तन करना संभव नहीं है?"।
उदाहरण के लिए, मुझे लगता है कि user.php
जो वर्ग MyUser
होता है और game.php
जो वर्ग MyGame
शामिल सहित एक main.php
फ़ाइल होने पर योजना बना रहा हूँ। अब मान लें कि मैं user.php
में परिवर्तन करना चाहता हूं और सर्वर को "पुनः लोड" करना चाहता हूं ताकि user.php
में परिवर्तन किसी भी ऑनलाइन उपयोगकर्ताओं को डिस्कनेक्ट किए बिना प्रभावी हो जाएं?
मैंने इसका उत्तर देने वाले अन्य प्रश्नों को खोजने का प्रयास किया, मुझे सबसे नज़दीकी यह सवाल है: Modifying a running script and having it reload without killing it (php), हालांकि ऑनलाइन उपयोगकर्ताओं के डिस्कनेक्शन को हल नहीं किया जा रहा है।
अद्यतन इस के लिए
मेरा अपना समाधान थे:
- विशेष occations में फ़ाइल external.php, जो कुछ चर तक पहुंचने और उन्हें तथापि का उपयोग यह चाहते हैं कर सकते हैं शामिल हैं। ऐसा करने पर, मुझे यह सुनिश्चित करना था कि कोड में कोई त्रुटि नहीं थी क्योंकि पूरे सर्वर को क्रैश हो जाएगा यदि मैंने ऐसी विधि तक पहुंचने का प्रयास किया जो मौजूद नहीं था।
- पूरी चीज जावा पर लिखें, जिसने मुझे गतिशील वर्ग रीलोडिंग का उपयोग करके प्लगइन सिस्टम जोड़ने की संभावना दी। एक जादू की तरह काम करता है। अलविदा PHP
मैं आम तौर पर एक XML अज्ञात प्रारूप में एक संशोधित "कॉन्फ़िगर" जानकारी संग्रहीत करता हूं जैसे एक्सएमएल फ़ाइल और इसे संशोधित करता हूं। फिर यह कॉन्फ़िगरेशन फ़ाइल को पुनः लोड करने के लिए एक सरल विधि कॉल होना चाहिए और जावा या पायथन में लिखी गई एक संपत्ति (उदाहरण के लिए) आसानी से सर्वर से बाहर भी आसानी से उपयोग कर सकती है। एक प्रोग्राम के स्रोत कोड को गतिशील रूप से बदलने के लिए? यह पहली जगह में एक बुरा विचार की तरह लगता है ... – rdlowrey
मुझे लगता है कि आपको वास्तव में क्या देखना चाहिए, यह है कि क्या आपको वास्तव में प्रति खिलाड़ी एक सॉकेट की आवश्यकता है या यदि आप इसके बजाय गेम को और अधिक राज्य बना सकते हैं। इस प्रकार क्लाइंट से सर्वर पर एक खुला कनेक्शन होने के बजाय, ग्राहक सामान्य वेब अनुरोध भेज सकता है। लेकिन मैं समझता हूं कि शायद कुल पुनर्लेखन का मतलब होगा और इस बिंदु पर कोई विकल्प नहीं है? साथ ही, php "अपरिभाषित" वर्गों का समर्थन नहीं करता है, इसलिए यदि आपने कक्षा "टेस्ट" को पहले ही परिभाषित किया है, तो आप फिर से कक्षा "टेस्ट" को परिभाषित करने के लिए फ़ाइल को फिर से शामिल नहीं कर सकते हैं। –
मुझे लगता है कि सभी ऑनलाइन गेम के बारे में मुझे पता है, जब व्यवस्थापक गेम फ़ाइलों में अपडेट लागू करना चाहता है, तो सर्वर को पुनः लोड किया जाता है और लोग डिस्कनेक्ट हो जाते हैं। शायद यह एक बेहतर संस्करण होना बेहतर होगा जहां सभी उपयोगकर्ता कनेक्ट हों और एक परीक्षण संस्करण जहां केवल आप (या कुछ चुनिंदा लोग) कनेक्ट हों। जब आप परिवर्तनों को लाइव करने के लिए चाहते हैं, तो आप उन्हें ऑनलाइन संस्करण में सहेजते हैं और सर्वर को पुनरारंभ करते हैं।इसका मतलब है कि आपको हर छोटे बदलाव के लिए ऑनलाइन संस्करण को पुनरारंभ करना पड़ेगा जिसे आप बनाना चाहते हैं। – Mike