用 unset($a); 會不會比較好?
unset($a);
也試過了
echo (memory_get_peak_usage()/(1024*1024))."\r\n";
仍然沒減少
呵呵~~你用錯~FUNCTION 測試了.
PEAK 字面上的解釋是 "最高峰值"
這要回顧一下 PHP 在~2007 年以前的歷史~~~
5.0X , 5.1X 真的很難用 , 問題也真的很多 .
2006 年時 11月 , PHP 5.2 Release , 5.2 之後修正了很多的BUG 也新增了很多功能.
其中有一個項目 就是 修正並且提昇了 記憶體管理 模組 的功能和效率.
新增了 --enable_memory_limit 還有 -enable-malloc-mm 的功能.
並且移除了 --disable-zend-memory-manager 的功能.
--enable-malloc-mm : 可以針對內部及外部 記憶體 做 DEBUG
同時也放出你現用的這支`FUNCTION , 因為要 TRACE 程式 記憶體的使用狀態~以避免程式因為 memory limit 而 出錯.PHP 5 一出來時 , 老闆新血來潮 , 命令 IT 團隊 改 OS 全部升級換成~5.0 , 導致我們其中一個服務 , 我一共改了五萬支~CODE 才讓我們的服務可以重新正式上線.
三天沒睡覺啊~!!!! 我寫了一堆轉換程式在 轉換程式裡的語法 , 才搶救了這場大災難.
所以我才因為這個痛 , 從 2004年忍到 2006年底才真的正式採用 PHP5 做為我的主要開發語言.
想起~2004年它突然出了個 mysql_real_escape_string , mysql_escape_string 突然出錯 , 它的改版有了細微的差異
等等.....主要是對 SQL INJECT 和 MSYQL 的改版做了一些調整....
所以....
我也是 PHP 5.2 後才正式讓公司採用 PHP5.X 因為 5.1 的問題仍然是蠻多的 , 畢竟 PHP5 它也才出來 2年多 要多給它點時間最佳化.
在那之前我不是很關心 PHP5 .
# 進入主題 SORRY 離題了.
它的主要功能是讓程式設計師可以管理程式的最高峰記憶體使用數.
不是用來查看 , 目前程式記憶體在這個 SCRIPT 下用了多少記憶體.
所以它不能拿來看 變數有沒有被清掉 , 因為它是讓寫程式的人 來監控自己這支程式 到底用了多少記憶體 以避免 PHP 程式 記憶體使用超過 memory_limit . 我寫了支 比較程式 - 請參考 :
<?php
echo "<pre>";
echo "Var Test : \n";
echo "usage : " . memory_get_usage() . "\n";
echo "usage peak : ". memory_get_peak_usage() . "\n";
$a = str_repeat("Hello", 10000000);
echo "usage : " . memory_get_usage() . "\n";
echo "usage peak : ". memory_get_peak_usage() . "\n";
unset($a);
echo "usage : " . memory_get_usage() . "\n";
echo "usage peak : ". memory_get_peak_usage() . "\n";
echo "Var Test : \n";
echo "usage : " . memory_get_usage() . "\n";
echo "usage peak : ". memory_get_peak_usage() . "\n";
$b = str_repeat("Hello", 10000000);
echo "usage : " . memory_get_usage() . "\n";
echo "usage peak : ". memory_get_peak_usage() . "\n";
unset($b);
echo "usage : " . memory_get_usage() . "\n";
echo "usage peak : ". memory_get_peak_usage() . "\n";
echo "Var Test : \n";
echo "usage : " . memory_get_usage() . "\n";
echo "usage peak : ". memory_get_peak_usage() . "\n";
$c = str_repeat("Hello", 10000000);
echo "usage : " . memory_get_usage() . "\n";
echo "usage peak : ". memory_get_peak_usage() . "\n";
unset($c);
echo "usage : " . memory_get_usage() . "\n";
echo "usage peak : ". memory_get_peak_usage() . "\n";
echo "Var Test : \n";
echo "usage : " . memory_get_usage() . "\n";
echo "usage peak : ". memory_get_peak_usage() . "\n";
$d = str_repeat("Hello", 10000000);
echo "usage : " . memory_get_usage() . "\n";
echo "usage peak : ". memory_get_peak_usage() . "\n";
unset($d);
echo "usage : " . memory_get_usage() . "\n";
echo "usage peak : ". memory_get_peak_usage() . "\n";
?>
結果分析 :
Var Test : 這是第一次用掉的最高記憶體數量.
usage : 233536
usage peak : 234600
usage : 50233704
usage peak : 50234816
usage : 233536
usage peak : 50234816
Var Test : // 第二次最高使用量仍然沒有提昇 , 但是也沒有成長. 因為 A 有 UNSET . ( 如果你沒有 UNSET 最高使用量就會爆增二倍 )
usage : 233536
usage peak : 50234816
usage : 50233704
usage peak : 50234816
usage : 233536
usage peak : 50234816
Var Test : // 第三次 最高使用仍然沒有提昇 , 但是也沒有成長. 因為 A , B 有 UNSET . ( 如果你沒有 UNSET 最高使用量就會爆增三倍 )
usage : 233536
usage peak : 50234816
usage : 50233704
usage peak : 50234816
usage : 233536
usage peak : 50234816
Var Test : // 第四個範例己經可以證明它是在觀查目前為止程式最高的 記憶體使用量 , 所以總量還是維持不變 . 如果你把 A,B,C 的 UNSET 都拿掉 它會直接成長到 四倍的使用率.
usage : 233536
usage peak : 50234816
usage : 733704
usage peak : 50234816
usage : 233536
usage peak : 50234816