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教程》
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。