广

PHP编程

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

    php5.2.0内存管理改进

    2018-10-28 11:06:24 次阅读 稿源:互联网
    零七广告
    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)。 

    零七网部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与零七网进行文章共享合作。

    零七广告
    零七广告
    零七广告
    零七广告