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 เท่านั้น