首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP unset() 全域變數銷毀機制深度解析與記憶體釋放技巧

     編輯:PHP 綜合知識

核心觀念:unset 是語言結構,非函數

自 PHP 4 起,unset() 不再是函數,而是語言結構,因此沒有回傳值,不可用於條件判斷。

函數內部無法直接銷毀全域變數

<?php
function destroy_foo() {
    global $foo;
    unset($foo);  // 僅銷毀區域參考
}
$foo = 'bar';
destroy_foo();
echo $foo;  // 輸出:bar
?>

原因:global $foo 建立的是區域參考,unset() 僅移除該參考,不影響全域變數本體。

正確銷毀全域變數:使用 $GLOBALS 陣列

<?php
function foo() {
    unset($GLOBALS['bar']);  // 直接操作全域符號表
}
$bar = "something";
foo();
var_dump($bar);  // NULL
?>

記憶體釋放機制實測

關鍵規則

  1. 變數值佔用超過 256 bytes 才會觸發記憶體釋放
  2. 所有指向該值的變數(含參考)皆銷毀後,記憶體才會真正釋放

實測程式碼

<?php
$test = str_repeat("1", 256);
$s = memory_get_usage();
unset($test);
$e = memory_get_usage();
echo '釋放記憶體: ' . ($s - $e);  // 輸出 272
?>

若字串長度 255,釋放量為 0。

參考變數情況

<?php
$test = str_repeat("1", 256);
$p = &$test;
unset($test);
echo $p;  // 仍輸出 256 個 1,記憶體未釋放
?>

有效釋放記憶體的兩種方法

方法一:指派 null 再 unset(順序重要)

<?php
$test = str_repeat("1", 256);
$p = &$test;
$s = memory_get_usage();
$test = null;        // 先斷開參考
unset($test);        // 再銷毀變數
$e = memory_get_usage();
echo '釋放記憶體: ' . ($s - $e);  // 272
var_dump($p);        // NULL
?>

方法二:銷毀所有指向該值的變數

<?php
$test = str_repeat("1", 256);
$p = &$test;
$s = memory_get_usage();
unset($p);
unset($test);        // 順序不影響結果
$e = memory_get_usage();
echo '釋放記憶體: ' . ($s - $e);  // 272
?>

最佳實務建議

  • 大型資料處理後,主動指派 $var = null 釋放記憶體
  • 避免不必要的參考傳遞(&$var)
  • 長時間運行的腳本(CLI/Queue Worker)需特別注意記憶體管理
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved