2010-03-23 16 views
11

मुझे पता है कि सभी संबंधित परिणाम स्मृति स्क्रिप्ट के निष्पादन के अंत में स्वचालित रूप से मुक्त हो जाती है। लेकिन क्या आप इसका उपयोग करने की सलाह देंगे, अगर मैं नीचे कुछ हद तक समान क्रियाओं का उपयोग कर रहा हूं?

$sql = "select * from products"; 
$result = mysql_query($sql); 
if($result && mysql_num_rows($result) > 0) { 
    while($data = mysql_fetch_assoc($result)) { 
    $sql2 = "insert into another_table set product_id = '".$data['product_id']."' 
       , product_name = '".$data['product_name']."' 
      "; 
    $result2 = mysql_query($sql2); 
    **mysql_free_result($result2);** 
    } 
} 

धन्यवाद।

+3

मैं ईमानदारी से आशा करता हूं कि आपके द्वारा उद्धृत कोड केवल चित्रण के लिए है - यह सब एक एकल SQL क्वेरी में किया जा सकता है: किसी अन्य_टेबल (product_id, product_name) में उत्पाद जोड़ें, उत्पाद_आईडी, उत्पाद_नाम उत्पादों से – symcbean

उत्तर

18

mysql_free_result के प्रलेखन का हवाला देते हुए:

mysql_free_result() केवल के नाम से जाना है, तो आप कैसे अधिक स्मृति प्रश्नों है कि बड़े परिणाम सेट लौटने के लिए इस्तेमाल किया जा रहा है के बारे में चिंतित हैं की जरूरत है।
सभी संबंधित परिणाम मेमोरी स्वचालित रूप से स्क्रिप्ट के निष्पादन के अंत में मुक्त हो गई।


तो, अगर प्रलेखन कहते हैं कि यह आम तौर पर आवश्यक है कि समारोह कॉल करने के लिए नहीं है, मैं कहूंगा कि यह वास्तव में आवश्यक नहीं है, और न ही अच्छा अभ्यास, कॉल करने के लिए यह ;-)

और, सिर्फ इतना कहना है : मैं लगभग कभी उस समारोह को कभी नहीं बुलाता; स्मृति स्क्रिप्ट के अंत में मुक्त हो जाती है, और प्रत्येक स्क्रिप्ट बहुत अधिक स्मृति नहीं खाती है।
एक अपवाद लंबे समय से चलने वाले बैच हो सकता है जिन्हें बड़ी मात्रा में डेटा से निपटना पड़ता है, हालांकि ...

1

यह इस बात पर निर्भर करता है कि आपके प्रश्न कितने बड़े हैं या आप कितने प्रश्न चलाते हैं। PHP स्वचालित रूप से स्क्रिप्ट के अंत में स्मृति को मुक्त करता है, लेकिन रन के दौरान नहीं। इसलिए यदि आपके पास किसी क्वेरी से आने वाली बड़ी मात्रा में डेटा है, तो मैन्युअल रूप से परिणाम को बेहतर तरीके से मुक्त करें।

मैं कहूंगा: हाँ, यह अच्छा अभ्यास है क्योंकि आप विकास के दौरान स्मृति या अपनी स्क्रिप्ट के बारे में परवाह है और कहा कि क्या एक अच्छा डेवलपर :-)

+0

मुझे विश्वास करें जब "mysql_free_result () "अपने आप पर कॉल एक अच्छे डेवलपर का एक अच्छा संकेतक नहीं है। – Kzqai

4

हाँ, यह 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>"; 
}); 

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

0

उत्तर निश्चित रूप से mysqli में हाँ है।
PHP mysqli_free_result documentation पर एक नज़र डालें:

तुम हमेशा) mysqli_free_result के साथ अपने परिणाम (, अपने परिणाम वस्तु की अब कोई आवश्यकता नहीं है जब मुक्त कर देना चाहिए।

मैं memory_get_usage समारोह के साथ यह परीक्षण करने के लिए प्रयोग किया है:

echo '<br>before mysqli free result: '.memory_get_usage(); 
mysqli_free_result($query[1]); 
echo '<br>after mysqli free result'.memory_get_usage(); 

और यह परिणाम है:

before mysqli free result:2110088 
after mysqli free result:1958744 

और यहाँ, हम में से केवल 1000 पंक्तियों में स्मृति के 151,344 bytes के बारे में बात कर रहे हैं MySQL तालिका। बड़ी परियोजनाओं के बारे में दस लाख पंक्तियों और कैसे सोचें?
mysqli_free_result() न केवल बड़ी मात्रा में डेटा के लिए है, यह छोटी परियोजनाओं के लिए भी एक अच्छा अभ्यास है।

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

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