首页
4K壁纸
直播
统计分析
友情链接
搜索
1
#1031 – TABLE STORAGE ENGINE FOR ” DOESN’T HAVE THIS OPTION解决方法
1,188 阅读
2
让浏览器不显示 https 页面中 http 请求警报 http-equiv=”Content-Security-Policy” content=”upgrade-insecure-requests”
922 阅读
3
报错代码:ERROR 1227 (42000)-解决办法
709 阅读
4
微信个人商户号养号建议
568 阅读
5
解决移动端position:fixed随软键盘移动的问题
535 阅读
Php
Mysql
Linux
Reids
Java
Python
常用笔记
学习
乱七八糟
Search
标签搜索
php
千卡云支付
Mysql
Linux
redis
千卡云
千卡易支付
function
Nginx
shell
JS
JSON
跨域
支付宝
CentOS
Apache
支付
Array
database
fastadmin
蓝科迪梦
累计撰写
88
篇文章
累计收到
0
条评论
首页
栏目
Php
Mysql
Linux
Reids
Java
Python
常用笔记
学习
乱七八糟
页面
4K壁纸
直播
统计分析
友情链接
搜索到
1
篇与
的结果
2025-09-26
PHP 问题解决:解决 "Allowed memory size of X bytes exhausted" 错误
PHP 问题解决:解决 "Allowed memory size of X bytes exhausted" 错误在 PHP 开发中,经常会遇到内存不足的致命错误:"Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate X bytes)"这个错误表明 PHP 脚本使用的内存量超过了配置的内存限制。本文将分析常见原因并提供解决方案。🧩 常见原因分析1. 处理大量数据一次性加载过多数据到内存中,如大文件读取、大批量数据库查询等。2. 无限递归或死循环函数递归调用没有正确的退出条件,导致栈溢出。3. 内存泄漏变量引用未正确释放,特别是在长时间运行的脚本中。4. 图片处理或大对象操作GD 库处理大图片、生成 PDF 等操作消耗大量内存。✅ 解决方法✅ 方法一:增加内存限制临时增加内存限制:ini_set('memory_limit', '512M'); // 设置为 512MB在 php.ini 中永久设置:memory_limit = 512M✅ 方法二:使用生成器处理大数据替代一次性加载所有数据:// 错误示例:一次性加载大量数据 function getAllUsers() { $users = []; $result = mysqli_query($connection, "SELECT * FROM users"); while ($row = mysqli_fetch_assoc($result)) { $users[] = $row; // 内存持续增长 } return $users; } // 正确示例:使用生成器 function getUsersGenerator() { $result = mysqli_query($connection, "SELECT * FROM users"); while ($row = mysqli_fetch_assoc($result)) { yield $row; // 按需返回数据 } } // 使用生成器 foreach (getUsersGenerator() as $user) { // 处理单个用户,不会占用大量内存 processUser($user); }✅ 方法三:分批处理数据将大任务分解为小批次:function processLargeDataset() { $limit = 1000; $offset = 0; do { $query = "SELECT * FROM large_table LIMIT $limit OFFSET $offset"; $result = mysqli_query($connection, $query); $rowCount = mysqli_num_rows($result); while ($row = mysqli_fetch_assoc($result)) { // 处理单行数据 processData($row); } $offset += $limit; // 释放内存 mysqli_free_result($result); // 强制垃圾回收(PHP 5.3+) gc_collect_cycles(); } while ($rowCount == $limit); }✅ 方法四:优化数组和对象使用及时销毁不需要的大变量:// 处理完数据后立即释放内存 $largeArray = loadLargeDataSet(); processData($largeArray); // 释放内存 unset($largeArray); // 或者设置为 null $largeObject = new LargeClass(); $largeObject->process(); $largeObject = null;✅ 方法五:使用流式处理文件避免一次性读取整个大文件:// 错误示例:一次性读取大文件 $content = file_get_contents('large_file.txt'); // 可能超出内存限制 // 正确示例:逐行处理 $handle = fopen('large_file.txt', 'r'); if ($handle) { while (($line = fgets($handle)) !== false) { // 处理单行数据 processLine($line); } fclose($handle); }✅ 方法六:监控内存使用在开发阶段监控内存使用情况:class MemoryMonitor { private static $peakMemory = 0; public static function checkMemory($label = '') { $current = memory_get_usage(true); $peak = memory_get_peak_usage(true); if ($peak > self::$peakMemory) { self::$peakMemory = $peak; } echo "Memory usage ($label): " . self::formatBytes($current) . " (Peak: " . self::formatBytes($peak) . ")\n"; } private static function formatBytes($size, $precision = 2) { $units = array('B', 'KB', 'MB', 'GB', 'TB'); for ($i = 0; $size > 1024 && $i < count($units) - 1; $i++) { $size /= 1024; } return round($size, $precision) . ' ' . $units[$i]; } } // 使用示例 MemoryMonitor::checkMemory('Start'); $data = loadSomeData(); MemoryMonitor::checkMemory('After loading data'); processData($data); MemoryMonitor::checkMemory('After processing');✅ 方法七:配置 CLI 模式内存限制对于命令行脚本,单独设置更高的内存限制:# 运行时设置内存限制 php -d memory_limit=1G your_script.php # 或在脚本中检测运行模式 if (php_sapi_name() === 'cli') { ini_set('memory_limit', '1G'); }🧰 推荐开发实践实践说明使用生成器处理大数据集避免一次性加载所有数据及时释放不需要的变量使用 unset() 或设置为 null分批处理大量数据将大任务分解为可管理的小块监控内存使用情况开发阶段使用内存监控工具区分 Web 和 CLI 内存需求CLI 脚本可以设置更高限制📝 总结原因解决方案处理大量数据使用生成器或分批处理无限递归检查递归退出条件内存泄漏及时释放变量引用图片处理优化图片处理逻辑配置不当调整 memory_limit 设置希望这篇原创文章能帮助你解决 PHP 中的内存不足问题!如果还有其他 PHP 相关疑问,欢迎继续提问。
2025年09月26日
4 阅读
0 评论
0 点赞