2008-10-29 10 views
22

मैं इस संदेह है वी.एस., मैं वेब खोज की है और जवाब के विविध कर रहे हैं। PHP के माध्यम से डेटाबेस से कनेक्ट करते समय mysql_connect पर mysql_pconnect का उपयोग करना बेहतर है? मैंने पढ़ा है कि पोनकनेक्ट स्केल बहुत बेहतर है, लेकिन दूसरी तरफ, एक सतत कनेक्शन होने के नाते ... एक ही समय में 10 000 कनेक्शन होने पर, सभी लगातार, मेरे लिए स्केलेबल नहीं लगते हैं।mysql_connect mysql_pconnect

अग्रिम धन्यवाद।

उत्तर

33

लगातार कनेक्शन MySQL के लिए अनावश्यक होना चाहिए। अन्य डेटाबेस (जैसे ओरेकल) में, कनेक्शन बनाना महंगा और समय लेने वाला होता है, इसलिए यदि आप कनेक्शन का दोबारा उपयोग कर सकते हैं तो यह एक बड़ी जीत है। लेकिन डेटाबेस के उन ब्रांड कनेक्शन पूलिंग की पेशकश करते हैं, जो समस्या को बेहतर तरीके से हल करता है।

एक MySQL डेटाबेस से कनेक्शन बनाना उन अन्य ब्रांडों की तुलना में तेज़ी से है, इसलिए लगातार कनेक्शन का उपयोग करके MySQL के लिए आनुपातिक रूप से कम लाभ मिलता है, यह डेटाबेस के किसी अन्य ब्रांड के लिए होता है।

लगातार कनेक्शन में भी कमी आई है। डेटाबेस सर्वर प्रत्येक कनेक्शन के लिए संसाधन आवंटित करता है, चाहे कनेक्शन की आवश्यकता हो या नहीं। यदि कनेक्शन निष्क्रिय हैं तो आप किसी भी उद्देश्य के लिए बहुत बर्बाद संसाधन देखते हैं। मुझे नहीं पता कि आप 10,000 निष्क्रिय कनेक्शन तक पहुंचेंगे, लेकिन यहां तक ​​कि कुछ सौ महंगा है।

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

कम से कम MySQL के लिए, लगातार कनेक्शन का नकारात्मक हिस्सा शायद उनके लाभ से अधिक है। और उच्च स्केलेबिलिटी प्राप्त करने के लिए अन्य, बेहतर तकनीकें हैं।


अद्यतन मार्च 2014:

MySQL कनेक्शन की गति हमेशा कम RDBMS के अन्य ब्रांडों की तुलना में था, लेकिन यह और भी बेहतर हो रही है।

हम कोड जोड़ता है और डिस्कनेक्ट से निपटने के अनुकूलन पर काम करना शुरू किया http://mysqlserverteam.com/improving-connectdisconnect-performance/

देखें MySQL 5.6 में। और यह काम MySQL 5.7 में तेज हो गया है। इस ब्लॉग पोस्ट में मैं सबसे पहले हमारे द्वारा प्राप्त किए गए परिणामों को दिखाऊंगा और फिर वर्णन करूँगा कि हमने उन्हें प्राप्त करने के लिए क्या किया है।

अधिक जानकारी और गति तुलना के लिए ब्लॉग पढ़ें।

3

यह बहुत संभावना नहीं है कि आप 10000 कनेक्शन पहुँचेंगे है। किसी भी तरह, official source पर जाएं। (जोर मेरा)।

तो लगातार कनेक्शन कोई अतिरिक्त कार्यक्षमता की जरूरत नहीं है, क्या वे के लिए अच्छा कर रहे हैं? दक्षता -

जवाब यहाँ अत्यंत सरल है। लगातार कनेक्शन यदि भूमि के ऊपर अपने एसक्यूएल सर्वर के लिए एक लिंक अधिक है बनाने के लिए अच्छे हैं। चाहे या यह ओवरहेड वास्तव में उच्च नहीं है कई कारकों पर निर्भर करता है। पसंद है, यह डेटाबेस है, चाहे वह पर उसी कंप्यूटर पर नहीं बैठता है, जो आपका वेब सर्वर बैठता है, कैसे मशीन को लोड किया गया है SQL सर्वर पर और आगे है। लब्बोलुआब यह उस कनेक्शन भूमि के ऊपर है अगर उच्च, लगातार कनेक्शन की मदद से आप काफी है। वे बच्चे प्रक्रिया बस अपने पूरे जीवन काल के लिए केवल एक बार कनेक्ट करने के लिए कारण, हर बार की बजाय इसे एक पेज है कि एसक्यूएल सर्वर से कनेक्ट की आवश्यकता है संसाधित करता है। इसका मतलब है कि प्रत्येक बच्चे के लिए एक लगातार कनेक्शन खोला जाएगा सर्वर के अपने स्वयं के खुले लगातार कनेक्शन है। उदाहरण के लिए, यदि आप 20 विभिन्न बच्चे प्रक्रियाओं है कि एक स्क्रिप्ट है कि एक लगातार कनेक्शन हो जाने अपने एसक्यूएल सर्वर से भाग गया था, तो आप एसक्यूएल सर्वर के लिए 20 विभिन्न कनेक्शन, प्रत्येक बच्चे से एक होगा।

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

4

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

फ्लिप पक्ष पर, आपके एप्लिकेशन को कनेक्शन की स्थिति का सम्मान करने की आवश्यकता है। यह सबसे अच्छा है अगर यह सत्र में कौन सा राज्य है, इस बारे में कोई धारणा नहीं है। यदि आप अस्थायी तालिकाओं का उपयोग करते हैं, तो क्रिएट का उपयोग करके EXISTS और TRUNCATE तालिका का उपयोग करना बहुत मदद करता है, जैसा कि उन्हें विशिष्ट रूप से नामित करता है (जैसे उपयोगकर्ता आईडी के रूप में)। लेनदेन थोड़ा और समस्याग्रस्त हैं; लेकिन आपका कोड हमेशा शीर्ष पर रोलबैक कर सकता है, बस मामले में।

+0

से जब मैं इस जबाब लिखा PHP के नवीनतम संस्करण में, मैं वहाँ अब पूल आकार एडजस्ट करने के लिए सेटिंग्स हैं कि पता चला है। विशेष रूप से, 5.4.0 में 'mysqli.max_persistent' विकल्प है जो PHP के उस उदाहरण में कनेक्शन पूल का अधिकतम आकार है। समय-समय पर कनेक्शन के लिए PHP में कोई मान नहीं है। – staticsan

3

mysql_connect() और mysql_pconnect() दोनों डेटाबेस कनेक्शन के लिए काम कर रहे हैं लेकिन थोड़ा अंतर के साथ काम कर रहे हैं। mysql_pconnect() में, p दृढ़ता कनेक्शन के लिए खड़ा है।

जब हम mysql_connect() फ़ंक्शन का उपयोग कर रहे हैं, तो हर बार जब यह अनुरोध के आधार पर डेटाबेस कनेक्शन खोल रहा है और बंद कर रहा है।

लेकिन mysql_pconnect() समारोह के मामले में:

  • सबसे पहले, जब जोड़ने, समारोह एक (लगातार) कनेक्शन पहले से ही एक ही मेजबान, उपयोगकर्ता नाम और पासवर्ड के साथ खुला है कि खोजने के लिए कोशिश करेंगे। यदि कोई पाया जाता है, तो इसके लिए एक पहचानकर्ता एक नया कनेक्शन खोलने के बजाय वापस कर दिया जाएगा।

  • दूसरा, स्क्रिप्ट के निष्पादन समाप्त होने पर SQL सर्वर से कनेक्शन बंद नहीं होगा। इसके बजाय, कनेक्शन भविष्य के उपयोग के लिए खुला रहेगा (mysql_close()mysql_pconnect() द्वारा स्थापित कनेक्शन बंद नहीं करेगा)।

mysql_pconncet() उपयोगी है जब आपकी साइट पर बहुत अधिक ट्रैफ़िस होता है। उस समय हर अनुरोध के लिए यह एक कनेक्शन नहीं खुलता है लेकिन इसे पूल से ले जाएगा। यह आपकी साइट की दक्षता में वृद्धि करेगा। लेकिन सामान्य उपयोग के लिए mysql_connect() सबसे अच्छा है।

+0

mysql_pconnect() mysqlnd के साथ उपयोग करना बेहतर है? ", फ़ंक्शन एक (लगातार) कनेक्शन ढूंढने का प्रयास करेगा जो पहले से ही होस्ट, उपयोगकर्ता नाम और पासवर्ड के साथ खुला है।" - मुझे लगता है कि यह mysqlnd के साथ बेहतर काम करता है या मैं गलत हूँ? – consigliere

0

mysql_connect()

1.mysql_connect connection.Every समय इसे खोलने और डेटाबेस कनेक्शन बंद करने, अनुरोध के आधार पर किया जाता है बंद करने के लिए इस्तेमाल किया जा सकता।

2.Here डेटाबेस हर खोला जाता है जब पेज MYSQL में भरी हुई है कनेक्ट

3. जब पृष्ठ लोड होने पर डेटाबेस भरी हुई है हर

4.It कनेक्शन बंद करने के लिए प्रयोग किया जाता है

उदाहरण:

<?php $conn = mysql_connect(‘host’, ‘mysql_user’, ‘mysql_password’); if(!$conn){ die(‘Could not connect: ‘ . mysql_error()); } echo ‘Connected successfully’; mysql_close($conn); ?> 

विवरण:

होस्ट: होस्टहोस्ट जैसे होस्ट नाम या आईपी पता निर्दिष्ट करता है।

mysql_user: निर्दिष्ट करता है MySQL उपयोगकर्ता नाम

mysql_password: MySQL पासवर्ड निर्दिष्ट करता

MYSQL_PCONNECT()

1. हम mysql_pconncet का उपयोग करें(), यह शुरू में एक खुला लगातार खोजने की कोशिश करता कनेक्शन।

2. mysql_pconncet() सतत् कनेक्शन खोलता

3. mysql_pconnect() घनिष्ठ संबंध का समर्थन नहीं करता

4.mysql_pconnect() कनेक्शन बंद नहीं कर सकते। यहां डेटाबेस

पर लगातार कनेक्शन खोलें 5. यहां डेटाबेस को हर बार कनेक्ट होने की आवश्यकता नहीं है।

6. डेटाबेस को mysql_pconncet() में हर बार कनेक्ट करने की आवश्यकता नहीं है।

अधिक जानकारी के: http://prittytimes.com/difference-between-mysql_connect-and-mysql_pconnect/

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