RELATEED CONSULTING
相关咨询
选择下列产品马上在线沟通
服务时间:8:30-17:00
你可能遇到了下面的问题
关闭右侧工具栏

新闻中心

这里有您想知道的互联网营销解决方案
PHP如何防止内存溢出

本篇文章展示了PHP防止内存溢出的具体操作,代码简明扼要容易理解,绝对能让你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

站在用户的角度思考问题,与客户深入沟通,找到沂南网站设计与沂南网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:做网站、成都做网站、企业官网、英文网站、手机端网站、网站推广、域名注册虚拟主机、企业邮箱。业务覆盖沂南地区。

内存溢出(Out Of Memory,简称OOM)是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。此时程序就运行不了,系统会提示内存溢出,有时候会自动关闭软件,重启电脑或者软件后释放掉一部分内存又可以正常运行该软件,而由系统配置、数据流、用户代码等原因而导致的内存溢出错误,即使用户重新执行任务依然无法避免。

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', '
'; foreach($arr as $key => $item) { $arr[$key] = $item + 1; if($item % 100000 == 0) { echo 'foreach中内存:'.round(memory_get_usage()/1024/1024, 2).'MB', '
'; } } echo 'foreach后内存:'.round(memory_get_usage()/1024/1024, 2).'MB', '
'; //输出 /* 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', '
'; foreach($arr as $key => &$item) { $arr[$key] = $item + 1; if($item % 100000 == 0) { echo 'foreach中内存:'.round(memory_get_usage()/1024/1024, 2).'MB', '
'; } }unset($key);unset($item);

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

看完上述内容,你们掌握PHP防止内存溢出的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读!


网页标题:PHP如何防止内存溢出
地址分享:http://lswzjz.com/article/gjppjo.html