0

0

内存不足导致错误如何解决_PHP高并发内存优化指南【详解】

看不見的法師

看不見的法師

发布时间:2026-02-14 09:37:02

|

453人浏览过

|

来源于php中文网

原创

根本原因在于脚本生命周期管理不当、资源未释放、循环引用及不合理数据加载;需通过流式查询、显式释放引用、限制静态缓存、设置pm.max_requests重启worker等手段治理,而非仅调大memory_limit。

内存不足导致错误如何解决_php高并发内存优化指南【详解】

PHP 高并发下内存不足(Allowed memory size exhausted)不是单纯调大 memory_limit 就能解决的,根源往往在脚本生命周期管理、资源未释放、循环引用或不合理的数据加载方式。

为什么 increase memory_limit 只是掩耳盗铃

临时把 memory_limit 从 128M 改成 512M,可能让报错消失,但并发一上来,OOM killer 仍会杀掉 PHP-FPM 子进程,甚至拖垮整个服务器。更危险的是:掩盖了真实泄漏点——比如一个 foreach 循环里反复 new 对象却不 unset,或 PDO 查询后没调用 $stmt->closeCursor()

  • PHP-FPM 的 pm.max_children 是按内存预估的,盲目调高 memory_limit 会导致实际可并发数暴跌
  • CLI 脚本中 memory_limit = -1 更危险——内存持续增长直到系统 kill
  • memory_get_usage(true)memory_get_peak_usage(true) 必须在关键路径前后打点,否则无法定位峰值来源

大数组和查询结果集是内存黑洞

一次 PDO::query() 返回几万行,用 fetchAll() 全部载入内存,极易爆掉。尤其 JSON 输出前还做 array_map 处理,每行都复制一份数组引用。

  • 改用 fetch()fetchColumn() 流式读取,处理完立刻丢弃引用
  • 对大数据导出场景,用 yield 写生成器函数,避免一次性构建完整数组
  • 禁用 PDO::ATTR_EMULATE_PREPARES(设为 false),防止 MySQL 驱动在内存中缓存整张结果集
  • 查完立刻调 $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC),避免默认 FETCH_BOTH 造成双倍字段存储

对象生命周期和引用计数必须手动干预

PHP 7+ 虽有 Zend GC,但对闭包、静态属性、全局数组里的对象引用仍不敏感。常见陷阱:类里存了 self::$instances[] = $this 却不清理;或用 function ($x) use ($largeArray) { ... } 捕获大变量。

快剪魔方
快剪魔方

AI漫剧高效制作工具

下载

立即学习PHP免费学习笔记(深入)”;

  • 显式调用 unset($obj) 后再置为 null,确保引用计数归零
  • 避免在循环内创建匿名函数,改用普通方法或提前绑定
  • 静态缓存(如 static $cache = [])必须加大小限制 + LRU 清理逻辑,不能无上限堆积
  • xdebug_debug_zval() 查看变量是否被意外引用(需 Xdebug 开启)

PHP-FPM 进程复用加剧内存累积

FPM worker 处理完请求后不会立即销毁全部变量——静态变量、OPcache 中的脚本结构、扩展分配的持久内存都会残留。多个请求串行打到同一 worker,内存只增不减。

  • 设置 pm.max_requests = 500~1000(非 0),强制 worker 达限后重启,释放累积内存
  • 禁用 opcache.enable_cli=1(CLI 场景),防止 OPcache 在长期运行脚本中越积越多
  • 避免在 __constructinit 方法中加载全量配置文件或大字典,改用按需加载(lazy load)
  • 检查扩展是否泄漏:用 php --ri opcacheopcache.memory_consumption 是否异常高;用 php --ri apcu 确认 apc.shm_size 是否超配

真正卡住人的,往往是某个 foreach 嵌套里忘了 unset($row),或者日志组件把整个 $_SERVER 数组塞进了单例的 debug stack —— 这些细节不打内存快照根本看不见。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

677

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

371

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

284

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

519

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

262

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

392

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

537

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

636

2023.08.14

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

76

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 11.8万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号