2012-11-26 13 views
9

क्या पीडीओ तैयार किए गए बयान उपयोग के बाद मुक्त हो जाना चाहिए? और यदि हां, तो कैसे? विशेष रूप से मैं MySQL के बारे में पूछ रहा हूं - आप पीडीओ के बावजूद DEALLOCATE PREPARE पर कॉल कर सकते हैं। (संपादित करें: स्पष्टीकरण के लिए, यह प्रश्न नकली तैयारियों का जिक्र नहीं कर रहा है, लेकिन असली तैयार करता है।)पीडीओ तैयार बयानों को मुक्त करना (डीलॉकेट तैयार करें)

इसके अलावा - क्या यह परिणाम सेट (जब बड़ा) होगा?

स्पष्टीकरण:

मैं

$stmnt = $db->prepare($sql); 
$stmnt->execute($aParams); 
$stmnt = null; 

की तर्ज जो मुझे सोच यह क्या करता है, कब, और अगर च unset($stmnt); अलग होगा, जिसके चलते कोड को देखा है?

मैनुअल इंगित करता है कि

जब क्वेरी तैयार किया जाता है, डेटाबेस, का विश्लेषण करेगा संकलन और क्वेरी को क्रियान्वित करने के लिए अपने योजना का अनुकूलन। [...] तैयार कथन का उपयोग करके एप्लिकेशन विश्लेषण/संकलन/अनुकूलन चक्र को दोहराने से बचाता है।

जो सुझाव देता है कि आपको बयान को आवंटित करना चाहिए, और MySQL की क्षमता है। तो,

  1. आप DEALLOCATE PREPARE फोन कर सकते हैं, और कैसे
  2. आप यह कर देना चाहिए?
  3. और क्या कोई यह पुष्टि कर सकता है कि सेटिंग कथन को शून्य (या कथन को अनसेट करना) के लिए mysql_ और mysqli_ के लिए "free_result" जैसा ही होगा?
  4. क्या यह तुरंत होता है, या क्या यह कचरा कलेक्टर को लात मारने का इंतजार करता है?

पूर्णता के लिए, एक और SO question "free_result" और mysqli_() के लिए "बंद" कार्यों की चर्चा करते हुए पता चलता है कि बयान को मुक्त कराने वास्तव में समय कहते हैं (जब तक आप बड़े स्मृति उपयोग किया है और स्थान की आवश्यकता है)। लेकिन "free_result" SQL सर्वर को तैयार किए गए स्टेटमेंट कैश करने से मुक्त करने से अलग है।

+0

क्या आप विशेष रूप से नकली तैयारियों को बंद कर रहे हैं? डिफ़ॉल्ट रूप से तैयार कथन ड्राइवर में नकल होते हैं, और अनुरोध के अंत में मुक्त होते हैं (जब सबकुछ जीसीडी होता है)। वैसे भी जानबूझ कर उन्हें मुक्त करने का मुद्दा क्या होगा? जहां संभव हो वहां तैयार बयानों का पुन: उपयोग करके प्रदर्शन लाभ प्रदान किया जाता है। बिंदु 3 को संबोधित करने के लिए, [free_result को एक कथन नष्ट होने पर बुलाया जाता है] (http://lxr.php.net/xref/PHP_5_4/ext/pdo_mysql/mysql_statement.c#55) (अनसेट, अनुरोध का अंत, आदि) - परीक्षण के बिना, मुझे विश्वास है कि dtors तुरंत कहा जाता है। – Leigh

+0

हां, मैं तैयार नहीं कर रहा हूं - क्षमा करें, इस प्रश्न में स्पष्ट होना चाहिए था (लेकिन अन्यथा सवाल व्यर्थ है)। उन्हें मुक्त क्यों करें? चूंकि कई सिंगल कॉल कथन हैं जिनका उपयोग उस कनेक्शन के लिए फिर से नहीं किया जाता है - इसलिए वे भी मुक्त हो सकते हैं (ऑप्टिमाइज़ेशन कैश नहीं किए जाते हैं)। जो लोग फिर से उपयोग करते हैं, वे मुझे पकड़ते हैं (जब तक अब आवश्यकता नहीं होती है, तब वही प्रश्न लागू होता है कि उन्हें कैसे मुक्त किया जाए)। – Robbie

उत्तर

3

क्या पीडीओ तैयार किए गए बयान उपयोग के बाद मुक्त हो जाना चाहिए? और यदि हां, तो कैसे?

MySQL के संदर्भ में? क्यों नहीं?

पीडीओ emulates prepared statements by default। इसका मतलब यह है कि पीडीओ स्वयं पैरामीटर प्रतिस्थापन, भागने, इत्यादि करता है, और देशी तैयार कथन का उपयोग करने के बजाय लाइन के नीचे एसक्यूएल के हिस्सों को भेजता है।

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

आप DEALLOCATE PREPARE से भी जुड़े हुए हैं। यह वाक्यविन्यास केवल आवश्यक है जब मैन्युअल रूप से SQL स्ट्रिंग के साथ PREPARE पर कॉल करना आवश्यक है। यह MySQL C-level API-based prepared statements की तुलना में एक पूरी तरह से और पूरी तरह से अलग कार्रवाई है, जो PDO_MYSQL उपयोग कर रहा है। (ठीक है, हो सकता है कि आप mysqlnd का उपयोग कर रहे हों, लेकिन यह प्रभावी रूप से एक ही चीज़ है।)

+0

क्षमा करें - मुझे यह स्पष्ट करना चाहिए था कि मैं वास्तविक तैयार बयानों का उपयोग करने का जिक्र कर रहा हूं। मुझे स्रोत नहीं मिल रहा है, लेकिन मुझे याद है कि "तैयार()" कॉलिंग को "PREAPRE" डेटाबेस में कॉल करना है - और इससे सवाल उठता है कि मुझे डीलॉकेट तैयार करना चाहिए। मैं परीक्षण करने जा रहा हूं कि तैयार होने के रूप में तैयार नहीं किया जाता है - मेरे पास काम पर सभी प्रश्न लॉग किए जा रहे हैं, इसलिए मैं आपके पास वापस आऊंगा)। मैं बफरिंग प्रश्न नहीं कर रहा हूं। प्रतिक्रिया के लिए धन्यवाद - मैं एक दिन में पालन करेंगे। – Robbie

+0

यदि आप सी-कोड (और mysqlnd) का उपयोग करते हुए वायर-स्तरीय एपीआई से निपटने के दौरान वास्तविक 'PREPARE' SQL * कहीं भी * देखते हैं, तो मैं टोपी खाऊंगा। ऐसा होगा ... * गलत * ... कि मेरे दिमाग को * सप्ताह * के लिए उड़ा दिया जाएगा कि यह कितना गलत था। – Charles

+2

कोई टोपी खाने की आवश्यकता नहीं है - मैंने अभी लॉग की जांच की है और जैसा आपने वर्णन किया है वैसा ही है। तैयार नहीं होता है, लेकिन तैयार करने के लिए एक कॉल() करता है - आपके द्वारा लिंक किए गए सी-लेवल एपीआई के साथ उपयुक्त है। और mysql_stmt_close (stmt)) को तत्काल भी कहा जाता है, संभवतः PHP में "शून्य" में stmnt को सेट करते समय (सीमित परीक्षण सीमित है, लेकिन लॉग में हमेशा "stmt close" का पालन करता है)। पॉइंटर्स के लिए धन्यवाद - मैं पूर्व में आराम करूँगा कि मैं इसे सही कर रहा हूं। – Robbie

0

हां। जब आप तैयार कथन के साथ काम करते हैं तो आप इसे NULL पर सेट कर सकते हैं या unset() का उपयोग कर सकते हैं।

एकाधिक प्रश्नों और बड़े डेटाबेस वाली एक स्क्रिप्ट के लिए, इससे कोई फर्क पड़ता है। आप इसके साथ परीक्षण कर सकते हैं:

$before = memory_get_usage(); 
$stmt = NULL; 
die(memory_get_usage() - before); 

मेरे लिए, इसने 20 एमबी मेमोरी को बचाया, जो बाद में स्क्रिप्ट को दुर्घटनाग्रस्त कर रहा था।

+0

प्रश्न पीडीओ कथन के बारे में नहीं है बल्कि तैयार कथन के बारे में है। अपने 20 एमबी को सहेजने के दौरान आपको एक अप्रयुक्त क्वेरी का उपयोग करना चाहिए था –

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