php5.2.0内存管理改进

yipeiwu_com5年前PHP代码库
php5.2.0的内存管理做了较大的改进,某些情况下内存不能释放的问题不存在了。
测试php脚本(mem.php),我用echo N>>和sleep来控制脚本在某个阶段暂停以便检测状态。
复制代码 代码如下:

<?php 
echo '1>>'; 
sleep(5); 

$o = array(); 
for ($i=0;$i<=100000;$i++) { 
    $o[]='aaaaaaaaaaaaaaaaaaaaa'; 

echo '2>>'; 
sleep(5); 

unset($o); 
echo '3>>'; 
while (true) { 
    echo '..'; 
    sleep(10); 

?> 
监测内存使用情况的bash script(注意:里面的”mem”是取自上面的php脚本名):

while true;do clear;ps au|grep -v "\(vi\|grep\)"|grep "\(mem\|RSS\)";sleep 2;done;
以下是$/usr/local/bin/php mem.php这个进程在三种状态(数组创建前,数组创建后,数组销毁后)下,用5.1.6和5.2.0的PHP(我使用了一样的configure参数)测试的RSS(内存使用值,单位KB)结果。

php5.1.6:
3164
18076
17572

PHP5.2.0:
4088
14400
4424
大家可以看到5.1.6这个版本,unset数组之后,内存并没有从进程里释放出来,虽然它是可以继续被这个php进程再利用,但是却无法被系统的其他进程所使用。而5.2.0则真正释放出了内存。

大家可能还注意到,在最开始,5.2.0的内存使用比5.1.6多了几个kb,这是由于5.2.0增加了一些新的东西,这个是很正常的。

另外php5.2.0的内存分配也进行了大的改进,官方的说法是对memory_limit的检测由每次呼叫emalloc()的时候进行改为直接检测从系统请求的内存数据块(blocks)。需要更进一步了解的朋友可以自己去研究代码。而由于内存分配的实现的更改,内存控制可以更精确地被控制在memory_limit之下,也就是说以前php代码里,如果有超过了memory_limit的内存使用而没有出错的,在php5.2.0里可能会报错。为了平衡这次改进,PHP5.2.0的默认的memory_limit由以前的8MB改为了16MB.搜索源代码可以看到这个修改(find . -name \*c -type f |xargs cat |grep memory_limit)。 

相关文章

php计算数组不为空元素个数的方法

复制代码 代码如下: <?php $arr = array( 1=>"11", 2=>"22", 3=>"33", 4=>"" ); print_r(cou...

VIM中设置php自动缩进为4个空格的方法详解

代码自然少不了文本编辑利器vim,自动缩进是用制表符的,即便自己删掉制表符改成4个空格,也会在下一层次缩进中继续用制表符,这就造成了空格和制表符混用可以修改、etc/vimrc的信息:其...

PHP高效获取远程图片尺寸和大小的实现方法

 PHP高效获取远程图片尺寸和大小的实现方法 在这里分享一下自己的心得,希望和大家一起分享技术,如果有什么不足,还请大家指正。写出这篇目的,就是希望大家一起成长,我也相信技术之...

PHP基于双向链表与排序操作实现的会员排名功能示例

本文实例讲述了PHP基于双向链表与排序操作实现的会员排名功能。分享给大家供大家参考,具体如下: 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前...

设置php页面编码的两种方法示例介绍

1:输出meta标签: 1、在php mvc的控制器里面或php页面echo '<meta http-equiv="content-type" content="text/html...