作者 主題: 記憶體問題  (閱讀 2938 次)

0 會員 與 1 訪客 正在閱讀本文。

micmic3

  • 俺是博士!
  • *****
  • 文章數: 1692
    • 檢視個人資料
記憶體問題
« 於: 2012-08-22 18:39 »
一個很大的 array ,$a=array(.....);
讓$a=null;記憶體還是沒放掉是怎麼回事啊~啊~啊~啊~

TyroneYeh

  • 俺是博士!
  • *****
  • 文章數: 2396
  • 性別: 男
    • 檢視個人資料
Re: 記憶體問題
« 回覆 #1 於: 2012-08-22 21:40 »
用 unset($a); 會不會比較好?
--
TyroneYeh

micmic3

  • 俺是博士!
  • *****
  • 文章數: 1692
    • 檢視個人資料
Re: 記憶體問題
« 回覆 #2 於: 2012-08-23 14:34 »
用 unset($a); 會不會比較好?
unset($a);
也試過了
echo (memory_get_peak_usage()/(1024*1024))."\r\n";
仍然沒減少

FIEND

  • 鑽研的研究生
  • *****
  • 文章數: 700
    • 檢視個人資料
    • http://bbs.ecstart.com
Re: 記憶體問題
« 回覆 #3 於: 2012-08-26 04:33 »
用 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


« 上次編輯: 2012-08-26 04:54 由 FIEND »
你累了嗎? 這樣不行 , 人要比 LINUX 兇 @@ " ......

micmic3

  • 俺是博士!
  • *****
  • 文章數: 1692
    • 檢視個人資料
Re: 記憶體問題
« 回覆 #4 於: 2012-08-27 09:11 »
喔喔~謝謝  FIEND 大