2010-04-11 11 views
29

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

क्या कहीं भी एक बेंचमार्क है जो अनसेट का उपयोग करने और अनसेट का उपयोग न करने के बीच अंतर की तुलना करता है?

+0

* (संबंधित) * http://www.php.net/manual/en/features.gc.refcounting-basics.php और http://blog.preinheimer.com/index.php?/ अभिलेखागार/354-मेमोरी-उपयोग-इन-PHP.html – Gordon

+0

उन लिंक के लिए धन्यवाद। वे उत्कृष्ट स्पष्टीकरण देते हैं। – dd0x

उत्तर

49

this example देखें (और article मैं सवाल नीचे लिंक):

$x = str_repeat('x', 80000); 
echo memory_get_usage() . "<br>\n";  // 120172 
echo memory_get_peak_usage() . "<br>\n"; // 121248 

$x = str_repeat('x', 80000); 
echo memory_get_usage() . "<br>\n";  // 120172 
echo memory_get_peak_usage() . "<br>\n"; // 201284 

आप देख सकते हैं, एक बिंदु पीएचपी में लगभग दोगुना स्मृति को इस्तेमाल किया था। ऐसा इसलिए है क्योंकि 'x'-string को $x पर निर्दिष्ट करने से पहले, PHP स्मृति में पिछली चर को पकड़ते समय स्मृति में नई स्ट्रिंग बनाता है। इसे unset टिंग $x से रोका जा सकता था।

एक और उदाहरण:

for ($i=0; $i<3; $i++) { 
    $str = str_repeat("Hello", 10000); 
    echo memory_get_peak_usage(), PHP_EOL; 
} 

हो जाएगा ताकि उत्पादन कुछ

तरह
375696 
425824 
425824 

पहले यात्रा $str पर अभी भी काम करने से पहले खाली है। दूसरे पुनरावृत्ति $str पर उत्पन्न स्ट्रिंग को हालांकि रखेगा। जब str_repeat को दूसरी बार बुलाया जाता है, तो यह तुरंत $str को ओवरराइट नहीं करेगा, लेकिन पहले स्ट्रिंग को स्मृति में असाइन किया जाना है। तो आप $str के साथ समाप्त हो जाते हैं और यह मान असाइन किया जाना चाहिए। डबल मेमोरी आप $str अनसेट हैं, तो यह नहीं होगा:

for($i=0;$i<3;$i++) { 
    $str = str_repeat("Hello", 10000); 
    echo memory_get_peak_usage(), PHP_EOL; 
    unset($str); 
} 

// outputs something like 
375904 
376016 
376016 

इससे कोई फर्क पड़ता है? खैर, लिंक किए गए आलेख में

यह महत्वपूर्ण नहीं है, सिवाय इसके कि यह महत्वपूर्ण है।

जब आपको अब उनकी आवश्यकता नहीं होती है तो यह आपके चर को अनसेट करने में कोई दिक्कत नहीं करता है। हो सकता है कि आप एक साझा मेजबान पर हों और बड़े डेटासेट पर कुछ पुनरावृत्ति करना चाहते हैं। अगर परेशान होने से PHP को के साथ समाप्त होने से रोक दिया जाएगा XXXX बाइट्स की स्वीकृत स्मृति आकार समाप्त हो गया है, तो यह छोटे प्रयास के लायक है।

क्या ध्यान में रखा जाना चाहिए, भले ही अनुरोध जीवनकाल केवल एक सेकेंड है, मेमोरी उपयोग को दोगुना करने से प्रभावी ढंग से अधिकतम अनुरोधों की अधिकतम राशि को प्रभावी ढंग से कम किया जा सकता है। यदि आप सर्वर की सीमा के करीब कहीं भी नहीं हैं, तो कौन परवाह करता है, लेकिन यदि आप हैं, तो एक साधारण अनसेट आपको अधिक रैम या अतिरिक्त सर्वर के लिए पैसे बचा सकता है।

+0

एक मौजूदा प्रोजेक्ट में मैं एक लूप के माध्यम से परिवर्तनीय आकार के कई HTML पृष्ठों को उत्पन्न करने के लिए PHP का उपयोग कर रहा हूं, इसलिए मुझे प्रत्येक लूप के अंत में सामग्री को धारण करने वाले चर को निश्चित रूप से अनसेट करना चाहिए। यह संभावित रूप से 'महत्वपूर्ण' सही हो सकता है? – dd0x

+0

@ dd0x सिद्धांत रूप में, हां। लेकिन व्यावहारिक रूप से, आपको यह देखने के लिए XDebug जैसे कुछ का उपयोग करना चाहिए ताकि यह देखने के लिए कि यह वास्तव में महत्वपूर्ण है या नहीं। मैं PHP में एक पूर्ण आवश्यकता की तुलना में स्केलिंग अनुकूलन के अधिक से अधिक परेशान करने पर विचार करता हूं। – Gordon

+0

@ dd0x बस जोड़ने के लिए, PHP में एक कचरा कलेक्टर है जो सुनिश्चित करता है कि 99.9% समय आपको चिंता करने की ज़रूरत नहीं है। – Yacoby

3

सी जैसे भाषाओं में लिखे जाने वाले अनुप्रयोग आमतौर पर कई घंटों तक चलते हैं। लेकिन सामान्य PHP एप्लिकेशन का रनटाइम लगभग 0.05 सेकेंड है। इसलिए, अनसेट का उपयोग करना बहुत कम महत्वपूर्ण है।

+5

हालांकि यह सच हो सकता है यह सही जवाब नहीं है। मैंने दिन के लिए PHP स्क्रिप्ट चलाए हैं। चूंकि PHP कचरा इकट्ठा होता है, जिस समय स्क्रिप्ट चल रही है, वह अधिकांश भाग अप्रासंगिक है। – Yacoby

+2

उत्तर यह भी इंप्रेशन देता है कि एक लंबे समय तक चलने वाली स्क्रिप्ट में 'अनसेट' की आवश्यकता होगी और 'अनसेट' 'मुक्त' के बराबर होगा। – Yacoby

+0

@Yacoby "* मैंने दिनों के लिए PHP स्क्रिप्ट चलाए हैं *" शायद आपको ऐसे विशिष्ट कार्यों के लिए कुछ और उपयोग करने की आवश्यकता है। PHP वेब अनुप्रयोगों के लिए अधिक उपयुक्त है, और वेब पृष्ठों को दिनों के लिए चलाने की आवश्यकता नहीं है। बेशक, वेब सर्वर अब 5 साल तक अधिक शक्तिशाली हैं (यहां तक ​​कि प्रति माह £ 3 के लिए सस्ते होस्टिंग वाले) और PHP कचरा संग्रह में सुधार हुआ है। संसाधन को मुक्त करने के लिए वैरिएबल को अनसेट करने की सलाह नहीं दी जाती है। – James

7

ऐसी कई स्थितियां हैं जिनमें अनसेट वास्तव में कुछ भी नहीं हटाएगा, इसलिए इसका उपयोग आम तौर पर काफी व्यर्थ है जब तक कि आपके कोड के तार्किक प्रवाह को इसके अस्तित्व की आवश्यकता न हो।

+3

यह भी कहा जाना चाहिए कि सभी स्मृति स्क्रिप्ट निष्पादन के अंत में मुक्त हो जाती है, इसलिए निष्पादन के अंत से पहले परेशान प्रदर्शन के लिए थोड़ा अच्छा (और यहां तक ​​कि हानिकारक भी हो सकता है)। – mattbasta

0

यह निर्भर करता है, आपको यह सुनिश्चित करना चाहिए कि आपको unset टेड बहुत लंबे तार (जैसे एक ब्लॉग पोस्ट की सामग्री डीबी से चुनी गई) है।

<?php 
$post = get_blog_post(); 
echo $post; 
unset($post); 
?> 
संबंधित मुद्दे