2012-07-03 12 views
12

मैं इसे यहां पूछ रहा हूं क्योंकि मुझे लगता है कि यह केवल EasyPHP से अधिक पर लागू होता है।PHP से EasyPHP MySQL सर्वर 1 सेकंड कनेक्शन देरी

मैं वर्तमान में अपने डब्ल्यूएएमपी विकास सर्वर के रूप में EasyPHP का उपयोग करता हूं ताकि मैं वेब एप्लिकेशन बना सकूं। समस्या यह है कि, जब मुझे डेटाबेस से कनेक्ट करने के लिए mysqli ऑब्जेक्ट मिलता है तो यह 1 सेकंड लगता है। 200 से अधिक तेजी से गति में साझा होस्टिंग परिणामों पर एक ही क्वेरी चलाना। क्या यह कुछ ऐसा होना चाहिए जिसके बारे में मुझे चिंतित होना चाहिए? स्केलेबिलिटी के मामले में या मेरे आवेदन को दूसरे सर्वर पर ले जाने के मामले में यह देखने में कितना समय लगेगा कि समस्या क्या है? मैंने अभी माना है कि शायद EasyPHP धीमा था। एक प्रमुख नहीं, बस कुछ ऐसा जो मुझे दिलचस्प के रूप में मारा।

उत्तर

45

यदि आपको यह समस्या हो रही है और विंडोज 7 से पहले विंडोज के संस्करण का उपयोग कर रहा है, तो शायद यह आपकी समस्या का उत्तर नहीं है।

ऐसा क्यों हो रहा है?

इस समस्या का कारण आईपीवी 4 बनाम आईपीवी 6 है।

जब आप किसी आईपी पते के बजाय होस्ट नाम का उपयोग करते हैं, तो MySQL क्लाइंट पहले नाम के लिए AAAA (IPv6) होस्ट लुकअप चलाता है, और अगर यह सफलतापूर्वक आईपीवी 6 पते पर नाम हल करता है तो यह पता पहले से प्रयास करता है। यदि कोई भी चरण विफल रहता है (नाम रिज़ॉल्यूशन या कनेक्शन) तो यह आईपीवी 4 पर गिर जाएगा, A लुकअप चला रहा है और इसके बजाय इस होस्ट को आजमा रहा है।

अभ्यास में इसका क्या अर्थ है कि यदि आईपीवी 6 localhost लुकअप सफल है लेकिन MySQL आईपीवी 6 लूपबैक से बंधे नहीं है, तो आपको एक कनेक्शन टाइमआउट चक्र (जाहिर है ओपी की मशीन पर यह 1 सेकंड है) की प्रतीक्षा करनी होगी आईपीवी 4 फॉलबैक होता है और कनेक्शन सफल होता है।

इसका कारण यह है localhost संकल्प किया गया था के माध्यम से मेजबान फ़ाइल, और यह केवल 127.0.0.1 साथ पहले से कॉन्फ़िगर आया, एक मुद्दा Windows 7 से पहले नहीं था - यह यह IPv6 समकक्ष ::1 है के साथ नहीं आया था।

विंडोज 7 के बाद से, localhost संकल्प DNS रिज़ॉल्यूवर में बनाया गया है, here के कारणों के लिए। इसका मतलब है कि आईपीवी 6 लुकअप अब सफल होगा - लेकिन MySQL उस आईपीवी 6 पते से बाध्य नहीं है, इसलिए कनेक्शन असफल हो जाएगा, और आप इस प्रश्न में उल्लिखित देरी देखेंगे।

यह अच्छा है। बस मुझे बताएं कि इसे पहले से कैसे ठीक किया जाए!

आपके पास कुछ विकल्प हैं।इंटरनेट के चारों ओर देखते हुए, सामान्य "समाधान" नाम के बजाय स्पष्ट रूप से आईपी पते का उपयोग करना प्रतीत होता है, लेकिन ऐसा करने के कुछ कारण नहीं हैं, पोर्टेबिलिटी दोनों संबंधित हैं, दोनों तर्कसंगत नहीं हैं:

  • यदि आप अपनी स्क्रिप्ट को दूसरी मशीन पर ले जाते हैं जो केवल IPv6 का समर्थन करता है, तो आपकी स्क्रिप्ट अब काम नहीं करेगी।

  • आप एक * nix आधारित होस्टिंग पर्यावरण के लिए अपनी स्क्रिप्ट ले जाते हैं, जादू स्ट्रिंग localhost मतलब होगा MySQL ग्राहक एक यूनिक्स सॉकेट अगर एक कॉन्फ़िगर किया गया है का उपयोग करना पसंद करेंगे, यह IP लूपबैक आधारित कनेक्टिविटी

    तुलना में अधिक कुशल है

हालांकि वे बहुत महत्वपूर्ण लगते हैं?

वे नहीं हैं। आपको अपने आवेदन को डिजाइन करना चाहिए ताकि इस तरह की चीज को कॉन्फ़िगरेशन फ़ाइल में परिभाषित किया जा सके। यदि आप अपनी स्क्रिप्ट को दूसरे वातावरण में ले जाते हैं, संभावना है कि अन्य चीजों को भी कॉन्फ़िगर करने की आवश्यकता होगी।

संक्षेप में, आईपी पते का उपयोग सर्वोत्तम समाधान नहीं है, लेकिन यह संभवतः एक स्वीकार्य है।

तो सबसे अच्छा समाधान क्या है?

माइस्क्लुएल सर्वर का उपयोग करने वाले बाध्य पते को बदलने का सबसे अच्छा तरीका होगा। हालांकि, यह उतना आसान नहीं है जितना कोई चाह सकता है। अपाचे, एनजिनक्स और लगभग हर दूसरे सायन नेटवर्क सेवा एप्लिकेशन के विपरीत, MySQL केवल एक बाध्य पता का समर्थन करता है, इसलिए यह केवल एक और जोड़ने का मामला नहीं है। सौभाग्य से, ऑपरेटिंग सिस्टम यहां कुछ जादू का समर्थन करते हैं, इसलिए हम MySQL को एक साथ आईपीवी 4 और आईपीवी 6 दोनों का उपयोग करने में सक्षम बना सकते हैं।

आपको MySQL 5.5.3 या बाद में चलने की आवश्यकता है, और आपको --bind-address= कमांड लाइन तर्क (या my.ini में इसी विकल्प को सेट करें) के साथ MySQL प्रारंभ करने की आवश्यकता है।

  • एक तो आप शायद से परिचित हैं, और एक है कि आप सबसे अधिक संभावना (प्रभावी रूप से) का इस्तेमाल कर 0.0.0.0: आप 4 विकल्पों docs, आप क्या करना चाहते हैं पर निर्भर करता है। यह मशीन पर उपलब्ध सभी आईपीवी 4 पते से जुड़ा हुआ है। यह वास्तव में संभवतः सबसे अच्छा काम नहीं है, भले ही आपको आईपीवी 6 की परवाह न हो, क्योंकि यह :: के समान सुरक्षा जोखिमों को पीड़ित करता है।

  • एक स्पष्ट आईपीवी 4 या आईपीवी 6 पता (उदाहरण के लिए 127.0.0.1 या ::1 लूपबैक के लिए)। यह उस पते पर सर्वर को बांधता है और केवल उस पते पर बाध्य करता है।

  • जादू स्ट्रिंग ::। यह आईपीवी 4 और आईपीवी 6 मोड में, लूपबैक और भौतिक इंटरफ़ेस पते दोनों मशीन पर MySQL को प्रत्येक पते पर बाध्य करेगा। यह संभावित रूप से एक सुरक्षा जोखिम है, केवल तभी ऐसा करें जब आपको दूरस्थ होस्ट से कनेक्शन स्वीकार करने के लिए MySQL की आवश्यकता हो।

  • IPv4-mapped IPv6 address का उपयोग करें। यह 4 -> 6 संक्रमण के दौरान पिछली संगतता के लिए आईपीवी 6 में बनाया गया एक विशेष तंत्र है, और यह आपको एक विशिष्ट आईपीवी 4 पते और इसके आईपीवी 6 समकक्ष से जुड़ने की अनुमति देता है। "डुएल लूपबैक" पता ::ffff:127.0.0.1 के अलावा किसी अन्य चीज़ के लिए आपके लिए उपयोगी होने की संभावना बहुत कम है।यह ज्यादातर लोगों के लिए सबसे अच्छा समाधान है, केवल लूपबैक के लिए बाध्यकारी है, लेकिन आईपीवी 4 और आईपीवी 6 कनेक्शन दोनों की इजाजत देता है।

क्या मुझे मेजबान फ़ाइल को संशोधित करने की आवश्यकता है?

नहीं। मेजबान फ़ाइल को संशोधित न करें। DNS रिज़ॉल्वर जानता है कि localhost के साथ क्या करना है, इसे फिर से परिभाषित करने से कोई प्रभाव नहीं पड़ेगा, और सबसे अधिक संकल्पक के बाहर नरक को भ्रमित कर देगा।

--skip-name-resolve के बारे में क्या?

यह संबंधित लेकिन थोड़ा अलग कारण के लिए समस्या को ठीक करने के लिए समस्या/समस्या को भी ठीक कर सकता है।

इस कॉन्फ़िगरेशन विकल्प के बिना, MySQL सभी क्लाइंट कनेक्शन आईपी पते को PTR DNS क्वेरी के माध्यम से होस्टनाम में हल करने का प्रयास करेगा। यदि आपका MySQL सर्वर पहले से ही आईपीवी 6 का उपयोग करने के लिए सक्षम है लेकिन कनेक्शन अभी भी काफी समय ले रहे हैं, तो ऐसा इसलिए हो सकता है क्योंकि रिवर्स डीएनएस (PTR) रिकॉर्ड सही तरीके से कॉन्फ़िगर नहीं किया गया है।

नाम समाधान को अक्षम करने से इस समस्या को ठीक किया जाएगा, लेकिन इसमें अन्य विधियां हैं, विशेष रूप से Host स्थिति में DNS नाम का उपयोग करने के लिए कॉन्फ़िगर की गई किसी भी एक्सेस अनुमतियां अब विफल हो जाएंगी।

यदि आप ऐसा करने जा रहे हैं, तो आपको नामों के बजाय आईपी पते का उपयोग करने के लिए अपने सभी अनुदानों को कॉन्फ़िगर करना होगा।

+12

-1 कोई jquery जो भी हो! – PeeHaa

+0

टीएल; डीआर! लॉल, वास्तव में, यह जवाब सही है। क्या आप जानते हैं कि MySQL 5.6 समस्या का समाधान करता है या नहीं? मैं इसके बजाय अपग्रेड कर सकता हूं। (लेकिन, गंभीरता से, कोई jQuery नहीं?) – MaxArt

+0

यह विंडोज 8 मशीनों के लिए बहुत धीमी mysql क्वेरी (एसईओ के लिए टिप्पणी) के साथ एक बहुत ही आम समस्या प्रतीत होता है। – Josiah

0

सर्वर के बावजूद, जब भी संभव हो, लगातार कनेक्शन का उपयोग करना अच्छा लगेगा। आखिरकार, जब भी पुराने लोग नौकरी कर सकते हैं तो नए कनेक्शन खोलना बुद्धिमान नहीं है। Mysqli के लिए manual पर एक नज़र डालें।

+0

मुझे लगातार कनेक्शन के साथ समस्याएं थीं - PHP ने कभी-कभी नए कनेक्शन बनाने की कोशिश की, हालांकि "मुक्त" मौजूदा कनेक्शन थे, जिसके परिणामस्वरूप "बहुत सारे कनेक्शन" त्रुटि हुई। हालांकि यह साल पहले था, इसलिए इसे पहले ही तय किया जा सकता है (या यह भी स्थानीय मुद्दा हो सकता है)। – binaryLV

+0

यह तय किया जाना चाहिए। Mysqli के लिए लगातार कनेक्शन PHP 5.3 में पेश किए गए थे, इसलिए वे पुराने नहीं हैं। – linepogl

+0

मुझे विश्वास है कि मुझे पीडीओ या पुराने mysql कार्यों के साथ समस्याएं थीं। वास्तव में कभी भी mysqli का उपयोग नहीं किया है। – binaryLV

23

जब मैं localhost का उपयोग MySQL सर्वर पते के रूप में करता हूं तो मुझे कुछ देरी हुई है। इसे 127.0.0.1 में बदलने में मदद मिली।

+0

ठीक है, आप अद्भुत हैं। बहुत बहुत धन्यवाद। मैंने होस्ट को 127.0.0.1 में बदल दिया और मेरे पेज 0.0074560547 सेकेंड में निष्पादित हो रहे हैं। पर्याप्त धन्यवाद नहीं कर सकता। – Sam

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