首页后端开发PHP关于PHP进程防止内存溢出的排查

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

时间2024-02-02 06:25:02发布访客分类PHP浏览796
导读:收集整理的这篇文章主要介绍了关于PHP进程防止内存溢出的排查,觉得挺不错的,现在分享给大家,也给大家做个参考。PHP进程内存大小是可以设置的,默认在配置文件 memory_limIT=128M也可以在程序中动态设置 ini_set('mem...
收集整理的这篇文章主要介绍了关于PHP进程防止内存溢出的排查,觉得挺不错的,现在分享给大家,也给大家做个参考。

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.9MBforeach中内存:81.36MBforeach中内存:84.42MBforeach中内存:87.47MBforeach中内存:90.52MBforeach中内存:93.57MBforeach中内存:96.62MBforeach后内存: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进程防止内存溢出的排查的详细内容,更多请关注其它相关文章!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: 关于PHP进程防止内存溢出的排查
本文地址: https://pptw.com/jishu/596477.html
PHP实现长轮询【代码示例】 php如何使用PHPAnalysis提取关键字中文分词

游客 回复需填写必要信息