第一部分:內存管理
PHP不需要顯式的對內存進行管理,這些工作都由Zend引擎進行管理了。PHP內部有一個內存管理體系, 它會自動將不再使用的內存垃圾進行釋放。
當系統提示如下錯誤時,說明php已經達到了允許使用的最大內存了。
Fatal error: Allowed memory size of X bytes exhausted (tried to allocate Y bytes)
一般造成內存不足的原因可能有:
一次性讀取超大文件到內存
超大的數組
循環沒有及時釋放不在使用的變量
php默認的最大使用內存是32M,可以通過php.ini 修改內存分配。
memory_limit = 128M
也可以通過php程序設置,php沒有禁用ini_set() 的時候
<?php
int_set("memory_limit", "1024M");
動態調整內存前,可以先獲取當前內存的分配和使用情況,可以通過兩個方法:
int memory_get_usage([ bool $real_usage = false ] );//返回當前分配給你的 PHP 腳本的內存量,$real_usage如果設置為 TRUE,獲取系統分配的真實內存尺寸。如果未設置或者設置為 FALSE,將是 emalloc() 報告使用的內存量。
int memory_get_peak_usage ([ bool $real_usage = false ] );//返回分配給你的 PHP 腳本的內存峰值字節數,如果設置為 TRUE 可以獲取從系統分配到的真實內存尺寸。 如果未設置,或者設置為 FALSE,僅會報告 emalloc() 使用的內存。
下面是php的內存管理器流程
]
它分為三層:存儲層(storage)、堆層(heap)和接口層(emmalloc/efree)。存儲層通過malloc()、mmap()等函數向系統申請內存,并通過freeze()函數釋放所申請的內存。儲層通常申請的內存塊都比較大,這里申請的內存大并不是指storage層結構所需要的內存大, 只是堆層通過調用存儲層的分配方法時,其以大塊大塊的方式申請的內存,存儲層的作用是將內存分配的方式對堆層透明化。
摘自:
http://www.php-internals.com/book/?p=chapt06/06-02-php-memory-manager