PHP 内存溢出常见解决方案

常见内存溢出的报错信息如下:

Severity: Error --> Allowed memory size of 268435456 bytes exhausted (tried to allocate 33554440 bytes)

产生的原因大致可以分为两种:

  1. 常驻内存的PHP脚本长时间执行,未释放内存。

  2. 数据查询过大,导致内存撑爆。

第一种主要表现在一些 php 运行的 脚本,比如 作为消息队列的消费者,进行逻辑处理,一直监听消息,处理过程中累积的变量数据占用内存。这种解决的思路可以通过 释放变量或者缩短脚本的持续时间来处理,比如:

  • 作为队列的消费者常驻内存,可以根据业务的调用量来定时重启,来达到释放内存的效果

  • 作为定时脚本,可以规定每次执行的数据量范围,通过多次执行脚本替代一次执行脚本

  • 处理过程中不要缓存数据(区分 fpm 和 cli 模式, fpm可以使用对象来缓存数据,达到每次请求內访问相同的数据不用再查询数据库,但是 cli 模式下最好不要使用)

  • 研究所用的框架,是否会存储信息,比如 ci 框架的 db, 默认会把所有执行的sql语句都保存在 实例中,这样就会导致数据库交互越多,占用的内存就越大,可以把 db 对应的 save_queries 设置成 false,在消费者这种场景下不进行存储,会对内存提升的更好。

第二种主要表现在与一些数据库或者中间件进行数据传输时,数据量太大导致内存溢出,查询数据查出来几百万,读取大量的excel数据等等。这种解决的思路可以通过分片,分段的方式来处理,比如:

  • 分多次从数据源获取数据

  • 每次执行后进行变量的释放 unset(主要针对较大的变量)

  • 适当的扩充内存 ini_set('memory_limit', '512M'),这种只适用于一些时间较短的脚本,在 fpm下不建议

总结: 常见的内存溢出主要是出现在cli模式下, fpm模式下一般不会出现,因为一次api请求结束后会自动释放内存, 而 cli 是常驻内存的,只有结束的时候才会释放。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值