2013-05-29 5 views
6

से निपटने वाला PHP मैं एंटरप्राइज़ लेवल PHP एप्लिकेशन चला रहा हूं। यह एक ब्राउज़र गेम है जिसमें हजारों उपयोगकर्ता बुनियादी ढांचे पर ऑनलाइन हैं जो मेरे मालिक ने अपग्रेड करने से इनकार कर दिया है और मशीनरी हर समय 2-3 सिस्टम लोड (हाँ लिनक्स) पर चल रही है। किसी भी तरह यह असली मुद्दा नहीं है। असली मुद्दा यह है कि कुछ उपयोगकर्ता तब तक प्रतीक्षा करते हैं जब तक कि सर्वर लोड नहीं हो जाता (प्राइम टाइम) और वे अपने माउस क्लिकर्स लाते हैं और वे 10-20 बार की तरह सबमिट सबमिट बटन पर क्लिक करते हैं, जबकि सर्वर अभी भी 10-20 अनुरोध भेज रहा है प्रारंभिक अनुरोध का उत्पादन, इस प्रकार कैश और डेटाबेस को अद्यतन नहीं किया गया।PHP समवर्ती

वर्तमान में मेरे पास प्रत्येक अनुरोध पर एक आउटपुट वैरिएबल है, जो 2 मिनट के लिए मान्य है और मेरे पास "म्यूटेक्स" लॉक है जो मूल रूप से memcache के अंदर एक झंडा है जो अगर स्क्रिप्ट के निष्पादन को अवरुद्ध करता है, लेकिन माउस क्लिकर बनाता है एक ही समय में इतने सारे अनुरोध कि वे लगभग एक साथ चलते हैं जो मेरे लिए एक बड़ा मुद्दा है।

आप इस मुद्दे से निपटने वाले स्टैक ओवरव्लो लोगों के बहुमत कैसे हैं। मैं कुकी/सत्र को ध्वजांकित करने के बारे में सोच रहा था, लेकिन मुझे लगता है कि अगर सर्वर ओवरलोड हो जाता है तो मुझे एक ही समस्या में मिल जाएगा। अनुकूलन असंभव है, स्रोत 7 साल पुराना है और काफी अनुकूल है, अधिकांश पृष्ठों (कैश से चलने) पर कोई प्रश्न नहीं है और केवल कुछ उपयोगकर्ता इनपुट पर डेटाबेस से पूछताछ की जा रही है, जैसे कि मैं रोकने की कोशिश कर रहा हूं।

हाँ यह वास्तविक वस्तु के साथ प्रक्रियात्मक कोड है। मशीनें PHP 5 चलाती हैं लेकिन कोड स्वयं PHP 4 से अधिक है। मुझे पता है, मुझे पता है कि यह पुराना और सामान है, लेकिन हम इस पूरे गड़बड़ी को फिर से लिखने के संसाधन को छोड़ नहीं सकते हैं क्योंकि अधिकांश मूल डेवलपर्स ने यह जान लिया कि सामान कैसे अंतर्निहित है और हाँ, मैं मूल रूप से पुराने छेद पैच कर रहा हूँ। लेकिन जहां तक ​​मुझे पता है कि यह लोड की गई PHP वेबसाइटों पर एक सामान्य मुद्दा है।

पीएस: सबमिट पर जावास्क्रिप्ट के साथ बटन को अक्षम करना एक विकल्प नहीं है। वास्तविक धोखेबाज उन्नत उपयोगकर्ता हैं। उनमें से एक ने एक बॉट क्लिकर लिखा था और इसे Google क्रोम एक्सटेंशन के रूप में पैक किया था। मत पूछो कि मैंने उससे कैसे निपटाया।

+3

आपने इससे कैसे निपट लिया ..? :) –

+2

मैं websockets का उपयोग करें। प्रक्रिया-प्रति-अनुरोध मॉडल इस तरह की चीज़ के लिए बहुत खराब फिट है। – rdlowrey

+0

हां ठीक है एप्लिकेशन पुराना है और इसमें उस फैंसी एमवीसी/बिगपाइप/जेएसओएन/एचटीएमएल 5 इतिहास की बात नहीं है जो आधुनिक वेबसाइटों का उपयोग करती है। – Sk1ppeR

उत्तर

1

मैं आपके कोड के बाहर एक समाधान की तलाश करूंगा।

पता नहीं कि आप किस सर्वर का उपयोग करते हैं लेकिन अपाचे में उदाहरण के लिए mod_evasive जैसे कुछ मॉड्यूल हैं।

तुम भी अपने फ़ायरवॉल

+0

मैं एनजीएक्सएक्स और PHP का उपयोग CGI पीएस के रूप में कर रहा हूं: मैंने आपको – Sk1ppeR

0

में एक आईपी से प्रति सेकंड कनेक्शन को सीमित IP कनेक्शन सीमित ही अपने खिलाड़ियों को नाराज कर देगा कर सकते हैं। मैंने पुराने स्टाइल कोड के साथ कुछ प्रसिद्ध ओपनसोर्स गेम क्लोन में बहुत सी चीजें तय की हैं और फिर से लिख दी हैं: अच्छी तरह से, मुझे यह कहना होगा कि धोखाधड़ी हमेशा सही प्रश्नों और तर्क को निष्पादित करने से बच सकती है। उदाहरण के लिए यहां देखें http://www.xgproyect.net/2-9-x-fixes/9407-2-9-9-cheat-buildings-page.html

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

स्क्रिप्ट के बारे में: मेरे गेम में मेरे पास एक php मॉड्यूल है जो स्वचालित रूप से डेटाबेस में सहेजी गई यादृच्छिक आईडी को जोड़कर लिंक को फिर से लिखता है, एक प्रकार का CSRFprotection। मानव उपयोगकर्ता बदले गए लिंक पर क्लिक करेगा, इसलिए उन्हें बदलाव दिखाई नहीं देंगे लेकिन स्क्रिप्ट पुराने लिंक के लिए पूछने का प्रयास करेंगे और कुछ प्रयास करने के बाद प्रतिबंधित हैं! अन्य स्क्रिप्ट्स डोम का उपयोग करती हैं, इसलिए पेज के चारों ओर कुछ बेकार डीआईवी डालने से बचना आसान है।

संपादित करें: यदि आप https://github.com/facebook/hiphop-php/wiki

1

मैं महसूस कर रही है कि यह कैसे किसी और चीज से एक विरासत कोड बेस को अद्यतन करने के बारे में अधिक छू रहा हो रही है के साथ अपने ऐप को बढ़ावा देने के कर सकते हैं।कुछ प्रकार की सहमति लागू करने के दौरान अच्छा होगा, पुराना कोड बेस आपकी वास्तविक समस्या है।

मैं अत्यधिक this video की सिफारिश करता हूं जो तकनीकी ऋण पर चर्चा करता है।

इसे देखें, फिर यदि आप पहले से नहीं हैं, तो व्यवसाय के मामले में अपने मालिक को समझाएं तकनीकी ऋण है। वह शायद यह समझ जाएगा। समझाओ कि कोड को अच्छी तरह से प्रबंधित नहीं किया गया है (ऋण चुकाया गया है) तकनीकी ऋण का एक बहुत ही उच्च स्तर है। चीजों को बेहतर बनाने के लिए छोटे incremental पुनरावृत्तियों का उपयोग करके उसे कैसे संबोधित करें उसे सुझाव दें।

+0

डाउनवोट नहीं किया है यह वीडियो स्पॉट-ऑन है। –

0

मुझे नहीं पता कि वहां पहले से कोई कार्यान्वयन है या नहीं, लेकिन मैं एक कैश सर्वर लिखने की सोच रहा हूं जिसके पास कैश मिस पर खुद को पॉप्युलेट करने की ज़िम्मेदारी है। यह दृष्टिकोण इस परिदृश्य में अच्छी तरह से काम कर सकता है।

असल में आपको मिश पर लंबित कैश स्लॉट को चिह्नित करने के लिए एक तंत्र की आवश्यकता है; लंबित मूल्य के पढ़ने से ग्राहक को एक छोटी लेकिन यादृच्छिक राशि सोना चाहिए और फिर से प्रयास करना चाहिए; एक पारंपरिक मॉडल में लंबित डेटा की आबादी क्लाइंट द्वारा लंबित की बजाय मिस का सामना करने के द्वारा की जाएगी।

इस संदर्भ में, स्क्रिप्ट क्लाइंट है, ब्राउज़र नहीं।

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