भाषा - PHP के साथ मेमोरी को मुक्त करने में क्या बेहतर है:अनसेट()या $ var=null




in hindi (10)

तत्काल मेमोरी को मुक्त न करने पर कोड को unset अभी भी बहुत उपयोगी है और जब भी हम किसी विधि से बाहर निकलने से पहले कोड चरणों पर जाते हैं तो ऐसा करने का एक अच्छा अभ्यास होगा। तत्काल स्मृति को मुक्त करने के बारे में ध्यान न दें। सीपीयू के लिए तत्काल मेमोरी है, रैम की माध्यमिक मेमोरी के बारे में क्या है।

और यह स्मृति रिसाव को रोकने के बारे में भी tackles।

कृपया यह लिंक http://www.hackingwithphp.com/18/1/11/be-wary-of-garbage-collection-part-2

मैं अब लंबे समय से अनसेट का उपयोग कर रहा हूं।

इस तरह के बेहतर अभ्यास को कोड में तत्काल रूप से अनसेट करने के लिए कोड जो पहले से ही सरणी के रूप में उपयोग किया गया है।

$data['tesst']='';
$data['test2']='asdadsa';
....
nth.

और just unset($data); सभी परिवर्तनीय उपयोग मुक्त करने के लिए।

कृपया संबंधित विषय को अनसेट करने के लिए देखें

PHP में चर सेट करने के लिए यह कितना महत्वपूर्ण है?

[बग]

मुझे एहसास है कि दूसरा फ़ंक्शन कॉल के ओवरहेड से बचता है ( अपडेट , वास्तव में एक भाषा निर्माण है), लेकिन यह जानना दिलचस्प होगा कि कोई दूसरे से बेहतर है या नहीं। मैं अपने अधिकांश कोडिंग के लिए unset() का उपयोग कर रहा हूं, लेकिन मैंने हाल ही में नेट से मिले कुछ सम्मानजनक वर्गों को देखा है जो बदले में $var = null उपयोग करते हैं।

क्या कोई पसंदीदा है, और तर्क क्या है?


unset वास्तव में एक समारोह नहीं है, लेकिन एक भाषा निर्माण । यह return या एक include से अधिक फ़ंक्शन कॉल नहीं है।

प्रदर्शन समस्याओं के अलावा, unset का उपयोग करके आपके कोड का इरादा बहुत स्पष्ट हो जाता है।


यह संदर्भ द्वारा कॉपी किए गए चर के लिए एक अलग तरीके से काम करता है:

$a = 5;
$b = &$a;
unset($b); // just say $b should not point to any variable
print $a; // 5

$a = 5;
$b = &$a;
$b = null; // rewrites value of $b (and $a)
print $a; // nothing, because $a = null

मुझे अभी भी इस बारे में संदेह है, लेकिन मैंने इसे अपनी स्क्रिप्ट पर आजमाया है और मैं यह जानने के लिए xdebug का उपयोग कर रहा हूं कि यह मेरे ऐप मेमोरी उपयोग को कैसे प्रभावित करेगा। स्क्रिप्ट इस तरह मेरे फ़ंक्शन पर सेट है:

function gen_table_data($serv, $coorp, $type, $showSql = FALSE, $table = 'ireg_idnts') {
    $sql = "SELECT COUNT(`operator`) `operator` FROM $table WHERE $serv = '$coorp'";
    if($showSql === FALSE) {
        $sql = mysql_query($sql) or die(mysql_error());
        $data = mysql_fetch_array($sql);
        return $data[0];
    } else echo $sql;
}

और मैं return कोड से पहले अनसेट जोड़ता हूं और यह मुझे देता है: 160200 तो मैं इसे $sql = NULL साथ बदलने की कोशिश करता हूं और यह मुझे देता है: 160224 :)

लेकिन जब मैं अनसेट () या NULL का उपयोग नहीं कर रहा हूं, तो इस तुलनात्मक पर कुछ अद्वितीय है, xdebug मुझे स्मृति उपयोग के रूप में 160144 दें

इसलिए, मुझे लगता है कि अनसेट () या NULL का उपयोग करने के लिए लाइन देने से आपके एप्लिकेशन में प्रक्रिया बढ़ जाएगी और आपके कोड के साथ मूल रहना बेहतर होगा और आप जिस वैरिएबल का उपयोग कर रहे हैं उतना प्रभावी कर सकते हैं।

अगर मैं गलत हूं, तो मुझे सुधारें, धन्यवाद


<?php
$start = microtime(true);
for ($i = 0; $i < 10000000; $i++) {
    $a = 'a';
    $a = NULL;
}
$elapsed = microtime(true) - $start;

echo "took $elapsed seconds\r\n";



$start = microtime(true);
for ($i = 0; $i < 10000000; $i++) {
    $a = 'a';
    unset($a);
}
$elapsed = microtime(true) - $start;

echo "took $elapsed seconds\r\n";
?>

ऐसा लगता है कि ऐसा लगता है कि "= शून्य" तेज है।

PHP 5.4 परिणाम:

  • 0.88389301300049 सेकंड लिया
  • 2.1757180690765 सेकंड लिया

PHP 5.3 परिणाम:

  • 1.7235369682312 सेकंड लिया
  • 2.9490 9 5 9 644318 सेकंड लिया

PHP 5.2 परिणाम:

  • 3.0069220066071 सेकंड लिया
  • 4.7002630233765 सेकंड लिया

PHP 5.1 परिणाम:

  • 2.6272349357605 सेकंड लिया
  • 5.0403649806976 सेकंड लिया

चीजें PHP 5.0 और 4.4 के साथ अलग दिखने लगती हैं।

5.0:

  • 10.038941144 9 43 सेकंड लिया
  • 7.0874409675598 सेकंड लिया

4.4:

  • 7.5352551937103 सेकंड लिया
  • 6.6245851516724 सेकंड लिया

ध्यान रखें microtime (true) PHP 4.4 में काम नहीं करता है इसलिए मुझे php.net/microtime / example # 1 में दिए गए microtime_float उदाहरण का उपयोग करना पड़ा।


मैंने unset और =null लिए एक नया प्रदर्शन परीक्षण बनाया, क्योंकि टिप्पणियों में उल्लेखित लिखित में एक त्रुटि है (तत्वों की पुनर्निर्माण)। मैंने सरणी का उपयोग किया, जैसा कि आप देखते हैं कि इससे कोई फर्क नहीं पड़ता।

<?php
$arr1 = array();
$arr2 = array();
for ($i = 0; $i < 10000000; $i++) {
    $arr1[$i] = 'a';
    $arr2[$i] = 'a';
}

$start = microtime(true);
for ($i = 0; $i < 10000000; $i++) {
    $arr1[$i] = null;
}
$elapsed = microtime(true) - $start;

echo 'took '. $elapsed .'seconds<br>';

$start = microtime(true);
for ($i = 0; $i < 10000000; $i++) {
    unset($arr2[$i]);
}
$elapsed = microtime(true) - $start;

echo 'took '. $elapsed .'seconds<br>';

लेकिन मैं केवल PHP 5.5.9 सर्वर पर इसका परीक्षण कर सकता हूं, परिणाम: - 4.45715713500 9 8 सेकेंड लिया - 4.4425978660583 सेकंड लिया

मैं पठनीयता के कारणों के लिए परेशान करना पसंद करता हूं।


200 9 में अनसेट मैनुअल के पेज में इसका उल्लेख किया गया था:

unset() बस उसका नाम कहता है - एक चर सेट करें। यह तत्काल स्मृति मुक्त करने के लिए मजबूर नहीं करता है। PHP के कचरा कलेक्टर इसे तब देखेगा जब यह फिट बैठता है - जल्द से जल्द इरादे से, क्योंकि उन CPU चक्रों की वैसे भी आवश्यकता नहीं होती है, या जैसे ही स्क्रिप्ट पहले स्मृति से बाहर हो जाती है, जो कुछ भी पहले होता है।

यदि आप $whatever = null; कर रहे हैं $whatever = null; तो आप वैरिएबल के डेटा को फिर से लिख रहे हैं। आपको स्मृति मुक्त हो सकती है / तेजी से संकीर्ण हो सकती है, लेकिन यह उस कोड से सीपीयू चक्र चुरा सकती है, जिसे वास्तव में जल्द ही उनकी आवश्यकता होती है, जिसके परिणामस्वरूप कुल निष्पादन समय होता है।

(2013 के बाद से, unset मैन पेज में उस अनुभाग को अब शामिल नहीं किया गया है)

ध्यान दें कि php5.3 तक, यदि आपके पास परिपत्र संदर्भ में दो ऑब्जेक्ट हैं , जैसे अभिभावक-बच्चे संबंध में, पैरेंट ऑब्जेक्ट पर अनसेट () को कॉल करना बच्चे ऑब्जेक्ट में पैरेंट संदर्भ के लिए उपयोग की गई स्मृति को मुक्त नहीं करेगा। (जब माता-पिता ऑब्जेक्ट कचरा-संग्रहित होता है तो स्मृति को मुक्त नहीं किया जाएगा।) ( बग 335 9 5 )

सवाल " अनसेट और = शून्य के बीच अंतर " कुछ अंतर बताते हैं:

unset($a) प्रतीक तालिका से $a को भी हटा देता है; उदाहरण के लिए:

$a = str_repeat('hello world ', 100);
unset($a);
var_dump($a);

आउटपुट:

Notice: Undefined variable: a in xxx
NULL

लेकिन जब $a = null का उपयोग किया जाता है:

$a = str_repeat('hello world ', 100);
$a = null;
var_dump($a);
Outputs:

NULL

ऐसा लगता है कि $a = null अपने unset() समकक्ष से थोड़ा तेज़ है: प्रतीक तालिका प्रविष्टि को अपडेट करना इसे हटाने से तेज़ प्रतीत होता है।

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

रिकॉर्ड के लिए, और उस समय को छोड़कर जो इसे लेता है:

<?php
echo "<hr>First:<br>";
$x = str_repeat('x', 80000);
echo memory_get_usage() . "<br>\n";      
echo memory_get_peak_usage() . "<br>\n"; 
echo "<hr>Unset:<br>";
unset($x);
$x = str_repeat('x', 80000);
echo memory_get_usage() . "<br>\n";      
echo memory_get_peak_usage() . "<br>\n"; 
echo "<hr>Null:<br>";
$x=null;
$x = str_repeat('x', 80000);
echo memory_get_usage() . "<br>\n";      
echo memory_get_peak_usage() . "<br>\n";

echo "<hr>function:<br>";
function test() {
    $x = str_repeat('x', 80000);
}
echo memory_get_usage() . "<br>\n";      
echo memory_get_peak_usage() . "<br>\n"; 

echo "<hr>Reasign:<br>";
$x = str_repeat('x', 80000);
echo memory_get_usage() . "<br>\n";      
echo memory_get_peak_usage() . "<br>\n"; 

यह वापस आता है

First:
438296
438352
Unset:
438296
438352
Null:
438296
438352
function:
438296
438352
Reasign:
438296
520216 <-- double usage.

निष्कर्ष, उम्मीद के अनुसार शून्य और अनसेट मुक्त स्मृति दोनों (केवल निष्पादन के अंत में नहीं)। साथ ही, एक चर को पुन: असाइन करने से मूल्य कुछ बिंदु पर दो बार होता है (520216 बनाम 438352)


ऑब्जेक्ट्स के बारे में, विशेष रूप से आलसी लोड परिदृश्य में, किसी को कचरा कलेक्टर निष्क्रिय सीपीयू चक्रों में चल रहा है, इस पर विचार करना चाहिए, इसलिए मान लें कि आप परेशानी में जा रहे हैं जब बहुत सारी ऑब्जेक्ट्स छोटी समय जुर्माना लोड कर रही हैं, तो स्मृति मुक्त हो जाएगी।

जीसी को स्मृति एकत्र करने में सक्षम करने के लिए time_nanosleep का उपयोग करें। परिवर्तनीय को शून्य पर सेट करना वांछनीय है।

उत्पादन सर्वर पर परीक्षण किया गया, मूल रूप से नौकरी 50 एमबी खपत थी और फिर रुक गई थी। नैनोस्लीप के बाद 14 एमबी का इस्तेमाल स्मृति स्मृति खपत था।

किसी को यह कहना चाहिए कि यह जीसी व्यवहार पर निर्भर करता है जो PHP संस्करण से संस्करण में बदल सकता है। लेकिन यह PHP 5.3 ठीक पर काम करता है।

जैसे। यह नमूना (कोड लिया गया VirtueMart2 google फ़ीड)

for($n=0; $n<count($ids); $n++)
{
    //unset($product); //usefull for arrays
    $product = null
    if( $n % 50 == 0 )
    {
        // let GC do the memory job
        //echo "<mem>" . memory_get_usage() . "</mem>";//$ids[$n];
        time_nanosleep(0, 10000000);
    }

    $product = $productModel->getProductSingle((int)$ids[$n],true, true, true);
    ...

मैं इसका उपयोग करता हूं इसलिए मैं बहुत से HTML के साथ PHP से बाहर तोड़ सकता हूं लेकिन इसे प्रस्तुत नहीं करता हूं। यह मुझे एक स्ट्रिंग के रूप में संग्रहीत करने से बचाता है जो रंग-कोडिंग को अक्षम करता है।

<?php
ob_start();
?>
<div>
    <span>text</span>
    <a href="#">link</a>
</div>
<?php
$content = ob_get_clean();
?>

के बजाय:

<?php
$content = '<div>
    <span>text</span>
    <a href="#">link</a>
</div>';
?>




php