2011-05-13 14 views
19

पीडीओ का उपयोग कर डेटाबेस में कनेक्शन स्थापित करते समय, पीडीओ विशेषता पीडीओ :: ATTR_PERSISTENT हर बार इस्तेमाल किया जाना चाहिए? यह कहता है कि यह उस उपयोगकर्ता के लिए लगातार कनेक्शन बनाता है, और जब भी आप डेटाबेस कनेक्शन के लिए पूछते हैं, तो एक नया सेट फिर से स्थापित करने के बजाय उसी कनेक्शन को पकड़ लेंगे। यह डिफ़ॉल्ट क्यों नहीं है? इसका उपयोग करने का कोई कारण नहीं है?पीडीओ :: ATTR_PERSISTENT हर बार इस्तेमाल किया जाना चाहिए?

+0

क्या आप इसे अपडेट कर सकते हैं ताकि अन्य उत्तर स्वीकार किया जा सके? मैंने मेरा हटाना करने की कोशिश की है क्योंकि केंडल बहुत बेहतर है लेकिन ऐसा नहीं कर सकता क्योंकि मेरा स्वीकार किया जाता है। –

उत्तर

12

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

आप शायद समय-समय पर कुछ गलत होने की उम्मीद कर सकते हैं, और गलत परिस्थितियों में संसाधनों के उपयोग की समस्या महीनों में रिसाव हो सकती है, यदि आपको ध्यान नहीं दिया जाता है, तो आपको बहुत धीरे-धीरे प्रदर्शन और वृद्धि में गिरावट आती है समय के साथ सिस्टम उपयोग में (सभी लाभ के लिए नहीं)।

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

Are PHP persistent connections evil ?

+1

पहला लिंक टूटा हुआ है। भय का प्रदर्शन करने के लिए –

44

आप सही तरीके से लेन-देन को संभाल नहीं है, तो यह एक सौदे में एक 'नई' लगातार कनेक्शन पहले से ही है, जो अराजकता पैदा कर सकता है हो सकता है।

बस एक साधारण निम्न कोड की वजह से मामला:

<?php 

$pdo = getCustomPersistantPDO(); 
$pdo->beginTransaction(); 
if(rand() % 2 === 0) { 
    //simulate a poorly handled error 
    exit(); 
} 
$pdo->commit(); 

?> 

अनुरोध 1:

(starts w/o a transaction open) 
openTransaction 
incorrectly handled error 
(never closes transaction) 

अनुरोध 2:

(start w/ a transaction open, because it was not closed in the previous connection.) 
openTransaction -> fails due to already open 

BTW उदाहरण के सही संस्करण है:

<?php 

$pdo = getCustomPersistantPDO(); 
$pdo->beginTransaction(); 
if(rand() % 2 === 0) { 
    //simulate a correctly handled error 
    $pdo->rollBack(); 
    exit(); 
} 
$pdo->commit(); 

?> 
+19

+1 – Charles

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

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