PHP中内存使用讨论欢迎拍砖

PHP开发过程中,高手都会用unset来释放内存,开始也没有深入了解,就跟着用,当然不是所有变量都unset,因为开发这么久了,也没感觉不unset有问题,但是最近的一个程序频繁出问题,总是内存不够用,为是么我知道内存不够用呢,因为使用ini_set(‘memory_limit’, ‘2000M’);增加内存以后,程序就正常了,所以很明显,内存不够用,但是PHP不是会释放内存的吗,为是么会导致内存不够呢,没错,PHP是会释放内存,但是是每个函数执行完释放一次,整个程序跑完才能完全释放,而为了采集,每个程序都由许多函数来跑,这些函数有的使用内存过多,还没能等到执行完毕释放内存,就死掉了,整个程序也就中断了,下面看几个例子,会有更深的体会。

  1. function test()
  2. {
  3. echo memory_get_usage().”    test函数开始使用内存\n”;
  4. $a[]=’a’;
  5. unset($a);
  6. echo memory_get_usage().”    给数组a赋值后使用内存\n”;
  7. $b[]=’b’;
  8. unset($b);
  9. echo memory_get_usage().”    给数组b赋值后使用内存\n”;
  10. $c[]=’c’;
  11. unset($c);
  12. echo memory_get_usage().”    给数组c赋值后使用内存\n”;
  13. }
  14. echo memory_get_usage() . ”    PHP读入当前文件所用内存,代码越多,内存占用越多\n”;
  15. test();
  16. echo memory_get_usage() . ”    运行完test函数所用内存\n”;
  17. test();
  18. echo memory_get_usage() . ”    再运行一次test函数所用内存\n”;
  19. ?>

结果:

321124    PHP读入当前文件所用内存,代码越多,内存占用越多

321144    test函数开始使用内存

321144    给数组a赋值后使用内存

321144    给数组b赋值后使用内存

321144    给数组c赋值后使用内存

321144    运行完test函数所用内存

321144    test函数开始使用内存

321144    给数组a赋值后使用内存

321144    给数组b赋值后使用内存

321144    给数组c赋值后使用内存

321144    再运行一次test函数所用内存

  1. function test()
  2. {
  3. echo memory_get_usage().”    test函数开始使用内存\n”;
  4. $a[]=’a’;
  5. //unset($a);
  6. echo memory_get_usage().”    给数组a赋值后使用内存\n”;
  7. $b[]=’b’;
  8. //unset($b);
  9. echo memory_get_usage().”    给数组b赋值后使用内存\n”;
  10. $c[]=’c’;
  11. //unset($c);
  12. echo memory_get_usage().”    给数组c赋值后使用内存\n”;
  13. }
  14. echo memory_get_usage() . ”    PHP读入当前文件所用内存,代码越多,内存占用越多\n”;
  15. test();
  16. echo memory_get_usage() . ”    运行完test函数所用内存\n”;
  17. test();
  18. echo memory_get_usage() . ”    再运行一次test函数所用内存\n”;
  19. ?>

结果:

320896    PHP读入当前文件所用内存,代码越多,内存占用越多

320916    test函数开始使用内存

321120    给数组a赋值后使用内存

321324    给数组b赋值后使用内存

321528    给数组c赋值后使用内存

320916    运行完test函数所用内存

320916    test函数开始使用内存

321120    给数组a赋值后使用内存

321324    给数组b赋值后使用内存

321528    给数组c赋值后使用内存

320916    再运行一次test函数所用内存

从以上结果得知:

1.函数内不unset变量的话内存会越用越多,但是这个占用是一时的,这个函数一执行完这些内存就会释放,所以不会导致整个程序占用内存过多,这就需要保证一个函数不能使用内存过多,否则超过额定内存(PHP的额定内存一般设置为38M,可以通过ini_set(‘memory_limit’, ‘2000M’)设置),程序就会退出。

2.函数内unset了变量,对于整个程序来说占用的内存更多,不unset反而用得少,这是是么原因呢,我个人觉得,从宏观角度来说,我们不去观察函数,而是把函数看成是一个操作,那这个操作内容越多,占用的内存就越多,所以执行unset这个操作后,使用的内存反而更多,当然,这个内存的增加是可以忽略不计的,而函数内部的变量如果很大的话,不unset的话,可能执行这个函数的时候就卡死在那里了,所以unset还是必须的

3.最后查了很多资料,了解到,在PHP4年代,PHP执行是内存不够用再向系统要,用完了再给回系统,所以内存占用从任务管理器里面可以很清楚的看到,但是PHP5之后,PHP执行的时候会先向系统征用一块大内存,然后自己管理,超过这个内存程序再向系统要,所以在任务管理器是看不出程序执行时内存使用情况的,这也导致很多人觉得unset可用可不用

这是我测试后个人得出的结果,欢迎拍砖

发表评论

返回顶部