2012-12-29 12 views
6

कोड बेहतर दिखाता है कि मैं क्या पूछ रहा हूँ:फ़ंक्शन समाप्त होने के तुरंत बाद PHP मुक्त स्थानीय चर क्या करता है?

function foo(){ 

    $var = get_huge_amount_of_data(); 

    return $var[0]; 
} 


$s = foo(); 

// is memory freed here for the $var variable created above? 

do_other_stuff(); // need memory here lol 

तो मुझे पता है कि $ वर कुछ बिंदु पर मुक्त कर दिया जाता है, लेकिन पीएचपी यह कुशलतापूर्वक क्या करता है? या क्या मुझे महंगी चर को अनसेट करने की ज़रूरत है?

+0

* कुशलतापूर्वक * - आप इस तरह से नहीं पूछ सकते हैं। आपको लगता है कि * कुशलता से * कुछ अलग हो सकता है (बीटीडब्ल्यू पूछने की आपकी शैली की अत्यधिक संभावना) वास्तव में *** PHP में ** कुशलतापूर्वक * है। – hakre

+0

अच्छी तरह से मेरा मतलब है, जैसे ही यह स्पष्ट हो जाता है कि चर का उपयोग नहीं किया जाएगा। –

+0

पहले भी। समारोह के अंत के साथ, सभी स्थानीय * चर * चले गए हैं। यदि डेटा स्मृति में (अस्थायी रूप से) रहता है या नहीं, तो यह महत्व का नहीं है। लेकिन यह जानने के लिए कि आपको स्मृति प्रबंधन के बारे में कुछ और जानने की जरूरत है जो मुझे लगता है कि आपकी ताकत नहीं है (कृपया कोई अपराध नहीं है)।सिस्टम से मेमोरी ब्लॉक को तुरंत आवंटित करना बहुत महंगा होगा, केवल इसलिए कि स्थानीय चर का उपयोग अब और नहीं किया जाता है। – hakre

उत्तर

3

आप एक वर्ग पर इस उदाहरण देख सकते हैं, कि क्योंकि आप कर सकते हैं "पकड़" एक चर वर्ग में मुक्त है 'नाशक:

class a { 
    function __destruct(){ 
    echo "destructor<br>"; 
    } 
} 

function b(){ // test function 
    $c=new a(); 
    echo 'exit from function b()<br>'; 
} 

echo "before b()<br>"; 
b(); 
echo "after b()<br>"; 

die(); 

यह स्क्रिप्ट आउटपुट:

before b() 
exit from function b() 
destructor 
after b() 

तो यह अब है स्पष्ट करें कि कार्य निकास पर चर नष्ट हो गए हैं।

+0

हालांकि, यह मुख्य दायरे पर लागू नहीं होता है। आप मुख्य स्क्रिप्ट में ऑब्जेक्ट वैरिएबल भी सेट कर सकते हैं और देख सकते हैं कि यह कब नष्ट हो जाता है - इसे 'मर' अंत तक रखा जाएगा, भले ही आप स्पष्ट रूप से अपने विनाशक को पहले कॉल करें! – Voitcus

2

हाँ, यह है, क्योंकि $var स्टैक पर घोषित करने और स्पष्ट रूप में जल्द ही यह गुंजाइश

के बाहर चला जाता है आप उल्लेख कर सकते हैं इस https://stackoverflow.com/a/5971224/307157

+1

मैं उस लिंक में बिल्कुल कुछ नहीं देखता हूं जो आपके द्वारा बताए गए संकेतों पर भी संकेत देता है। वह पृष्ठ विशेष रूप से अर्थशास्त्र के बारे में है। कोई अन्य संदर्भ? -1 के लिए अब। – delnan

2

तो मुझे पता है कि $ वर कुछ बिंदु पर मुक्त कर दिया जाता है मिलता है लेकिन क्या PHP इसे कुशलतापूर्वक करता है? या क्या मुझे महंगी चर को अनसेट करने की ज़रूरत है?

हां, PHP एक अच्छा काम करता है। यह एक प्रश्न है जिसके बारे में आपको कभी सोचना नहीं चाहिए। आपके मामले में मैं $var = .. और return .. के बीच के पल के बारे में सोचूंगा, क्योंकि वह क्षण है, जहां आप स्मृति खपत से बच नहीं सकते हैं। आपको समाधान खोजने का प्रयास करना चाहिए, जहां आपको पूरे डेटासेट को get_huge_amount_of_data() के माध्यम से लाने की आवश्यकता नहीं है और फिर एक आइटम का चयन करें, लेकिन केवल आपको आवश्यक डेटा चुनें।

4

हां यह मुक्त हो जाता है।

आप का उपयोग करके यह देख सकते हैं:

function a() { 
    $var = "Hello World"; 
    $content = ""; 
    for ($i = 0; $i < 10000; $i++) { 
     $content .= $var; 
    } 
    print '<br>$content size:'.strlen($content); 
    print '<br>memory in function:'.memory_get_usage(); 
    return null; 
} 

print '<br>memory before function:'.memory_get_usage(); 
a(); 
print '<br>memory after function:'.memory_get_usage(); 

उत्पादन:

memory before function:273312 
$content size:110000 
memory in function:383520 
memory after function:273352 

इससे पहले समारोह पीएचपी इस्तेमाल किया 273,312 बाइट्स।
फ़ंक्शन समाप्त होने से पहले हमने फिर से मेमोरी उपयोग की जांच की और यह 383520 का उपयोग किया।
हमने 110000 बाइट्स की $ सामग्री का आकार चेक किया।
273312 + 110000 = 383312
शेष 208 बाइट अन्य चर से हैं (हमने केवल $ सामग्री की गणना की है)
फ़ंक्शन समाप्त होने के बाद हमने फिर से मेमोरी उपयोग की जांच की और यह वापस (लगभग (40 बाइट्स अंतर)) था जैसा कि पहले था

40 बाइट्स अंतर कार्य घोषणाओं और लूप घोषणा के लिए होने की संभावना है।