网站首页 文章专栏 php 内存溢出处理及防溢出优化
常用的两种解决办法:
1.代码部分可以针对这段代码,临时增加运行的内存上限:
ini_set('memory_limit','256M');//设置运行最大内存为256M,但是在safe_mode(安全模式下会失效的)
2.直接修改配置文件php.ini,对所有PHP进程统一设置最大内存,简单粗暴:
memory_limit=256M //-1 为无上限,但是不建议,除非这台机器只跑PHP
虽说遇到这种报错能用上面的两种方法解决,但是真心不建议这么做,作为一个合格的PHPer,应该尽可能的降低自己代码的运行内存,这直接影响了接口的并发能力,并且可以确保其他进程能正常运行。
优化部分:
下面以我们公司的几个接口为例(基于lumen6.0框架),简单分析下php运行内存效率:
1.获取token:
刚进入入口文件:412984 (0.39M)//入口index.php 文件
刚进入一个接口文件:20976344 (20.00M)//加载完框架自带的一堆东西,内存直接来到了20M!!还没开始自己的代码部分呢
从数据库读取一条数据:21400280 (20.40M)
对数据加密成token:24378072 (23.24M)
运行完一个常用的获取token接口,直接使用了23M。可以预见要是4个人同时登录,内存将直接来到100M。
2.获取用户消息列表:
刚进入入口文件:415240 (0.39M)
刚进入一个接口方法,已进行token解析:24370296 (23.24)
程序执行完毕:26552544 (25.32M)
加载完框架的东西、走完中间件对客户端代token解密之后,啥都没做呢,内存已经23M了,要是接口逻辑再复杂点,像导出excel这种运行内存真的是上不封顶,只能自求多福了。
我一直认为比起解决问题,如何去规避问题的发生才是更重要的。如何优化代码,尽可能降低运行内存,查了很多资料,汇总如下:
1.首当其冲,对于大数组进行数据切割处理,或者尽可能减少数组的容量,尽可能减少调用次数,尽量使用引用传递 &;
2.用过之后的变量及时销毁,unset(),或者将变量赋值成null;更建议赋值成null,因为unset()虽然销毁的变量,但是很多时候并没有释放内存,赋值成null,则直接改变了内存大小;
3.尽量少用全局变量和静态变量,这些变量的生命周期都是永久,进程没结束都不会销毁的;
4.数据库操作完成后,要马上关闭连接;这一点一般比较难做到,因为现在写代码习惯了框架约束,以laravel为例,从进程开始就帮你注册了数据库链接,当你开始第一次调用数据库,就直接建立了一个全局的闭包系统,直到进程结束才断开数据库链接。
5.还是数据库方面的,不需要的数据不要查找出来,减少数据运算量;
6.构造类,养成顺手加上析构函数的习惯(__destruct());
7.需要导出 excel表格,建议用 csv代替
......
优化方法很多,怎么用也全又自己决定。
建议自己写完一个方法用memory_get_usage()函数查看下各个地方的内存占用,及时优化.
转载请注明出处