第一部分:内存管理
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