हाँ, यह mysql_free_result($result)
उपयोग करने के लिए अच्छा अभ्यास है बनाता है। स्वीकृत उत्तर में उद्धृत दस्तावेज गलत है। दस्तावेज कहता है, लेकिन इससे कोई मतलब नहीं आता है।
mysql_free_result() केवल यदि आप प्रश्नों है कि बड़े परिणाम सेट लौटने के लिए इस्तेमाल किया जा रहा है कितना स्मृति बारे में चिंतित हैं कॉल किया जाना चाहिए: यहाँ क्या यह says है। स्क्रिप्ट के निष्पादन के अंत में सभी संबंधित परिणाम स्मृति स्वचालित रूप से मुक्त हो जाती है।
पहली वाक्य का पहला भाग सही है। यह सच है कि आपको स्मृति चिंताओं के अलावा अन्य कारणों के लिए इसका उपयोग करने की आवश्यकता नहीं है। मेमोरी चिंताओं का उपयोग करने का एकमात्र कारण है। हालांकि, पहली वाक्य का दूसरा भाग कोई समझ नहीं आता है। दावा यह है कि आप केवल उन प्रश्नों के लिए स्मृति के बारे में चिंतित होंगे जो बड़े परिणाम सेट लौटाते हैं। यह बहुत भ्रामक है क्योंकि अन्य सामान्य परिदृश्य हैं जहां स्मृति चिंता का विषय है और mysql_free_result()
पर कॉल करना बहुत अच्छा अभ्यास है। किसी भी समय प्रश्नों को अज्ञात संख्या में चलाया जा सकता है, यदि आप mysql_free_result()
पर कॉल नहीं करते हैं तो अधिक से अधिक स्मृति का उपयोग किया जाएगा। इसलिए यदि आप अपनी क्वेरी को लूप में या फ़ंक्शन या विधि से चलाते हैं, तो आमतौर पर mysql_free_result()
पर कॉल करना एक अच्छा विचार है। आपको केवल तब तक सावधान रहना होगा जब तक इसका उपयोग नहीं किया जाएगा।आप अपने स्वयं के चयन() और पूर्व() फ़ंक्शंस बनाकर इसे कब और कैसे उपयोग कर सकते हैं, इस बारे में सोचने से खुद को ढाल सकते हैं ताकि आप परिणाम सेट के साथ सीधे काम नहीं कर रहे हों। (यहां कोई भी कोड बिल्कुल सही तरीके से लिखने का तरीका नहीं है, यह अधिक चित्रकारी है। आप इन्हें कक्षा या विशेष नामस्थान में रखना चाहते हैं, और एक अलग अपवाद प्रकार फेंक सकते हैं, या $class_name
आदि जैसे अतिरिक्त पैरामीटर ले सकते हैं। ।)
// call this for select queries that do not modify anything
function select($sql) {
$array= array();
$rs= query($sql);
while($o= mysql_fetch_object($rs))
$array[]= $o;
mysql_free_result($rs);
return $array;
}
// call this for queries that modify data
function ex($sql) {
query($sql);
return mysql_affected_rows();
}
function query($sql) {
$rs= mysql_query($sql);
if($rs === false) {
throw new Exception("MySQL query error - SQL: \"$sql\" - Error Number: "
.mysql_errno()." - Error Message: ".mysql_error());
}
return $rs;
}
अब अगर आप केवल कॉल select()
और ex()
, तो आप सिर्फ सामान्य वस्तु चर और स्मृति प्रबंधन को करने के बजाय केवल सामान्य स्मृति चिंताओं के साथ काम कर रहे हैं। आपको अभी भी सामान्य स्मृति चिंताओं के बारे में सोचना है जैसे वस्तुओं की सरणी द्वारा कितनी मेमोरी उपयोग में है। चर के दायरे से बाहर निकलने के बाद, या आप इसे मैन्युअल रूप से शून्य पर सेट करते हैं, यह कचरा संग्रह के लिए उपलब्ध हो जाता है ताकि PHP आपके लिए इसका ख्याल रख सके। यदि आप अपना कोड अब इसका उपयोग नहीं करते हैं, तो भी आप इसे दायरे से बाहर करने से पहले इसे शून्य पर सेट करना चाहते हैं और उसके बाद ऑपरेशन हैं जो लूप और अन्य फ़ंक्शन कॉल जैसे अज्ञात मात्रा में स्मृति का उपयोग करते हैं। मुझे नहीं पता कि उनके द्वारा संचालित परिणाम सेट और फ़ंक्शंस हुड के तहत लागू किए गए हैं (और यदि मैंने किया है, तो यह PHP और MySQL के विभिन्न/भविष्य के संस्करणों के साथ बदल सकता है), इसलिए संभावना है कि select()
लगभग युगल कार्य करता है mysql_free_result($rs)
से पहले उपयोग की गई स्मृति की मात्रा को बुलाया जाता है। हालांकि चुनिंदा() का उपयोग करना अभी भी समाप्त हो जाता है जो हम आम तौर पर लूप और विभिन्न फ़ंक्शन कॉल के दौरान उपयोग की जाने वाली अधिक से अधिक स्मृति की प्राथमिक चिंता करते हैं। यदि आप डबल मेमोरी उपयोग के लिए इस संभावना के बारे में चिंतित हैं, और आप एक ही पुनरावृत्ति पर एक समय में एक पंक्ति के साथ काम कर रहे हैं, तो आप प्रत्येक() फ़ंक्शन कर सकते हैं जो आपके मेमोरी उपयोग को दोगुना नहीं करेगा, और फिर भी आपको सोच के बारे में mysql_free_result()
:
each($sql,$fun) {
$rs= query($sql);
while($o= mysql_fetch_object($rs))
$fun($o);
mysql_free_result($rs);
}
आप इसे इस तरह उपयोग कर सकते हैं:
each("SELECT * FROM users", function($user) {
echo $user->username."<BR>";
});
प्रत्येक() का उपयोग करते हुए कि यह कुछ भी वापस नहीं करता है, तो आप चाहे बारे में सोचने की जरूरत नहीं है का एक और लाभ या वापसी मूल्य को बाद में शून्य पर सेट न करें।
मैं ईमानदारी से आशा करता हूं कि आपके द्वारा उद्धृत कोड केवल चित्रण के लिए है - यह सब एक एकल SQL क्वेरी में किया जा सकता है: किसी अन्य_टेबल (product_id, product_name) में उत्पाद जोड़ें, उत्पाद_आईडी, उत्पाद_नाम उत्पादों से – symcbean