php - 你能解释一下这个与内存耗尽有关的令人困惑的 PHP 致命错误吗?
问题描述
今天,PHP (CLI) 死于此错误:
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 58724352 bytes)
(134217728 = 128 MB和 58724352 = 56 MB。)
它尝试下载的文件只有73 MB,远不及 128 MB 内存限制。
达到 128 MB 的内存限制是什么意思?我的脚本的其他代码在 (128 - 73) MB 附近没有使用...更像是 2-3 MB顶部...
“试图分配 56 MB”是什么意思?那是指超过限制的56 MB吗?如果是这样,它仍然没有任何意义,因为 73 MB 已经远小于 128 MB。
顺便说一句,将内存限制增加到 256 MB “修复”了这个问题,因为它下载了文件而没有死亡或记录任何错误,但我仍然想了解它的含义以及为什么它在 128 MB 应该失败时失败绰绰有余。
PS:是的,我知道我应该以块的形式下载大文件,而不是将其全部保存在 RAM 中直到完成,但是执行此操作的代码太复杂且烦人*无法实现,所以现在,我我只是询问 PHP 的那个错误和这种行为是什么意思。
(*我已经把它放在我庞大的“待办事项”清单中......)
解决方案
达到 128 MB 的内存限制是什么意思?
这意味着您已为每个 PHP 实例配置了 128 Mb 的限制 - 您的脚本无法在其中运行。
那是指超过限制的56 MB吗?
是的
我的脚本的其他代码在 (128 - 73) MB 附近没有使用......更像是 2-3 MB 顶部......
它尝试下载的文件只有 73 MB,远不及 128 MB 的内存限制。
它读取的数据可能是 base64 编码的——这增加了开销。解码后的数据在写入磁盘之前可能存在于内存中。
我知道我应该分块下载大文件,而不是把它全部保存在 RAM 中直到完成
不,但是给每个 PHP 进程荒谬的内存量也不是解决问题的正确方法。
但是执行此操作的代码太复杂且烦人*无法实现
`curl --output $localfile $url`;
太复杂?
推荐阅读
- jenkins - GitHub webhook 无法连接到 VPN 内的 Jenkins?
- react-native - 如何在反应原生中拖动视图
- android - 升级 Flutter 会导致这个错误:“当前 Flutter 版本是 0.0.0-unknown”
- automation - CANopen 中的 PDO 链接
- google-apps-script - 将 Excel 转换为 Gsheet,然后在不需要 Auth 的情况下导入它们
- python - 我正在尝试找到平均速度并想要使用 Python 的最简单方法
- python - 在循环外继续,掷骰子脚本
- c++ - 有什么区别:派生类构造函数是否通过使用取消引用调用抽象类构造函数进行初始化?
- angular - 带有 RxJS 存储的 Angular Reactive Form 用于数字输入
- c# - 如何在 Caliburn Micro 中使用 LostFocus