网站首页 文章专栏 php 内存溢出处理及防溢出优化

php 内存溢出处理及防溢出优化

编辑时间:2020-09-28 17:53:28 作者:苹果 浏览量:2793


    前言:运行一段代码,有时候会遇到报错突然报错:PHP Fatal error: Allowed memory size of 2097152 bytes exhausted at....,内存溢出了,然后报错了,今天难得有空,整理下相关处理方法。


常用的两种解决办法:

    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()函数查看下各个地方的内存占用,及时优化.



    出自:何冰华个人网站

    地址:https://www.hebinghua.com/

    转载请注明出处


来说两句吧
最新评论