当前位置:首页 > PHP教程 > php高级应用 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2022-07-02 08:45:26 浏览: 评论:0 

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.遍历赋值其他变量

  1. $arr = range(0, 599999); 
  2.  
  3. echo 'foreach前内存:'.round(memory_get_usage()/1024/1024, 2).'MB', '<br/>'; 
  4.  
  5. foreach($arr as $key => $item) { 
  6.  
  7.     $arr[$key] = $item + 1; 
  8.  
  9.     if($item % 100000 == 0) { 
  10.  
  11.         echo 'foreach中内存:'.round(memory_get_usage()/1024/1024, 2).'MB', '<br/>'; 
  12.  
  13.     } 
  14.  
  15. } 
  16.  
  17. echo 'foreach后内存:'.round(memory_get_usage()/1024/1024, 2).'MB', '<br/>'; 
  18.  
  19.  
  20.  
  21. //输出 
  22.  
  23. /* 
  24.  
  25. foreach前内存:49.9MB 
  26.  
  27. foreach中内存:81.36MB 
  28.  
  29. foreach中内存:84.42MB 
  30.  
  31. foreach中内存:87.47MB 
  32.  
  33. foreach中内存:90.52MB 
  34.  
  35. foreach中内存:93.57MB 
  36.  
  37. foreach中内存:96.62MB 
  38.  
  39. foreach后内存:49.9MB 
  40.  
  41. */ 

解决方法,采用引用遍历

  1. $arr = range(0, 599999); 
  2.  
  3. echo 'foreach前内存:'.round(memory_get_usage()/1024/1024, 2).'MB', '<br/>'; 
  4.   
  5. foreach($arr as $key => &$item) { 
  6.  
  7.     $arr[$key] = $item + 1; 
  8.  
  9.     if($item % 100000 == 0) { 
  10.  
  11.         echo 'foreach中内存:'.round(memory_get_usage()/1024/1024, 2).'MB', '<br/>'; 
  12.  
  13.     } 
  14.  
  15. }unset($key);unset($item); 

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

Tags: PHP进程 PHP内存溢出

分享到: