ลดปริมาณการใช้หน่วยความจำด้วย unset()

unset and memory usage

unset() เป็นฟังก์ชั่นในการลบหรือทำลายตัวแปรนั้นๆทิ้งไป โดยฟังก์ชั่นนี้มีมาตั้งแต่ PHP 4.0.1
มีความสามารถในการทำลายตัวแปรได้ทุกประเภท ไม่ว่าจะ integer, string, array, object, ... แต่ทั้งนี้ก็มีข้อจำกัดอยู่บ้างแตกต่างกันในบางเวอร์ชั่นของ PHP เช่น ใน PHP 5 จะไม่สามารถ unset ตัวแปร $this ภายใน class ได้เลย

ความสามารถในการลดปริมาณการใช้งาน memory

เมื่อมีการประกาศตัวแปรทุกครั้ง ก็จะมีการสำรองหน่วยความจำเอาไว้ให้ใช้ทุกครั้ง เมื่อตัวแปรยิ่งเยอะ ก็ยิ่งกินหน่วยความจำมากขึ้นไปอีก.
ถ้าหากว่าคุณพัฒนาฟังกชั่นหนึ่ง ที่มีการทำงานในขนาดใหญ่พอสมควรหรือใช้งานหน่วยความจำเยอะๆ เช่น การย่อรูป หากคุณมีการประกาศตัวแปรมากๆในฟังก์ชั่นนั้น การทำงานหนักๆต่อหลังจากนั้นจะทำไม่ได้เลย ถ้ามันต้องใช้หน่วยความจำเกินกว่าที่ server กำหนดอนุญาตเอาไว้ให้.

แต่ถ้าหากมีการล้างสิ่งต่างๆที่"ทำงานของมันเสร็จแล้ว" มันก็จะทำให้ปริมาณหน่วยความจำที่ถูกกันเอาไว้ ลดลง มีที่ว่างมากขึ้น ทำงานที่หนักๆได้ต่อไป.

การทดสอบ

ผมได้เขียนโค้ดขึ้นมาหน้าหนึ่ง เพื่อทำการทดสอบกำหนดตัวแปรที่เป็น array และกำหนดค่าให้มัน แล้วเขียนดักดูการใช้งาน memory ในขั้นตอนต่างๆ ดังนี้.


// get memory usage at start point
$memory_start = memory_get_usage();

for ( $i = 1; $i <= 100000; $i++ ) {
    $array[] = $i;
}

// get memory usage at end point
$memory_end = memory_get_usage();

unset( $array );

// get memory usage at end point after unset.
$memory_end_unset = memory_get_usage();

// get memory peak.
$memory_peak = memory_get_peak_usage();

// show memory usage results.
echo 'memory at start: '.formatSizeUnits( $memory_start ).'<br />';
echo 'memory atend: '.formatSizeUnits( $memory_end ).'<br />';
echo 'memory at end after unset: '.formatSizeUnits( $memory_end_unset ).'<br />';
echo 'memory peak: '.formatSizeUnits( $memory_peak ).'<br />';


/**
 * byte conversion from http://stackoverflow.com/questions/5501427/php-filesize-mb-kb-conversion
 */
 function formatSizeUnits($bytes) {
    if ($bytes >= 1073741824) {
        $bytes = number_format($bytes / 1073741824, 2) . ' GB';
    } elseif ($bytes >= 1048576) {
        $bytes = number_format($bytes / 1048576, 2) . ' MB';
    } elseif ($bytes >= 1024) {
        $bytes = number_format($bytes / 1024, 2) . ' KB';
    } elseif ($bytes > 1) {
        $bytes = $bytes . ' bytes';
    } elseif ($bytes == 1) {
        $bytes = $bytes . ' byte';
    } else {
        $bytes = '0 bytes';
    }

    return $bytes;
}

จากการทดลอง พบว่า เมื่อกำหนดตัวแปร array ประมาณ 100000 ตัวแปร และกำหนดค่าให้เป็นตัวเลข จะมีการใช้หน่วยความจำมากถึง 8 MB เลยทีเดียว.
และเมื่อทำการ unset หลังทำงานจบสิ้นแล้ว หน่วยความจำที่ใช้ลดลงเหลือเพียง 130 กว่า KB เท่านั้น

 

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

คุณอาจใช้แท็กHTMLและแอททริบิวต์เหล่านี้: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>