• 技术文章 >后端开发 >php教程

    关于PHP进程防止内存溢出的排查

    藏色散人藏色散人2020-06-24 14:24:10转载806

    PHP进程内存大小是可以设置的,默认在配置文件 memory_limit=128M

    也可以在程序中动态设置 ini_set('memory_limit', '1024M');这样就设置成1G了。但是一般不会这样设置,毕竟会影响到机器的其他服务。有时候可以排查一下代码,很多时候内存溢出是因为php变量没有及时释放,或者遍历比较大的数组时出现。

    1.排查

    memory_get_usage() php有这个系统函数,可以得到当前进程使用了多少内存空间。返回是字节单位round(memory_get_usage()/1024/1024, 2).'MB',转换为MB.

    可以追踪代码执行过程中内存的变化。

    2.常见内存溢出的案例

    遍历大型数组,修改数组的某些值,导致遍历过程数组复制一份。

    php变量的特点是“写时复制”,

    当涉及$arr数组赋值时,会产生分裂,生成新的HashTable结构体,导致内存占用瞬间变大

    3.遍历赋值其他变量

    $arr = range(0, 599999);
    echo 'foreach前内存:'.round(memory_get_usage()/1024/1024, 2).'MB', '<br/>';
    foreach($arr as $key => $item) {
        $arr[$key] = $item + 1;
        if($item % 100000 == 0) {
            echo 'foreach中内存:'.round(memory_get_usage()/1024/1024, 2).'MB', '<br/>';
        }
    }
    echo 'foreach后内存:'.round(memory_get_usage()/1024/1024, 2).'MB', '<br/>';
    
    //输出
    /*
    foreach前内存:49.9MB
    foreach中内存:81.36MB
    foreach中内存:84.42MB
    foreach中内存:87.47MB
    foreach中内存:90.52MB
    foreach中内存:93.57MB
    foreach中内存:96.62MB
    foreach后内存:49.9MB
    */

    解决方法,采用引用遍历

    $arr = range(0, 599999);
    echo 'foreach前内存:'.round(memory_get_usage()/1024/1024, 2).'MB', '<br/>';
    
    foreach($arr as $key => &$item) {
        $arr[$key] = $item + 1;
        if($item % 100000 == 0) {
            echo 'foreach中内存:'.round(memory_get_usage()/1024/1024, 2).'MB', '<br/>';
        }
    }unset($key);unset($item);

    遍历完成后记得unset($key);unset($item); 因为$item是对数组最后一个元素的引用,后面如果修改这个变量,会直接修改到数组。

    推荐:《PHP视频教程

    以上就是关于PHP进程防止内存溢出的排查的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:csdn,如有侵犯,请联系admin@php.cn删除
    专题推荐:PHP 内存溢出
    上一篇:PHP实现长轮询【代码示例】 下一篇:php如何使用PHPAnalysis提取关键字中文分词
    大前端线上培训班

    相关文章推荐

    • PHP内存溢出、命令行和Web服务两种执行方式的理解• phpExcel在导出文件时内存溢出的解决方法• php内存溢出常见原因• 谈谈关于PHP内存溢出的思考

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网