首页 > 解决方案 > 你能解释一下这个与内存耗尽有关的令人困惑的 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 的那个错误和这种行为是什么意思。

(*我已经把它放在我庞大的“待办事项”清单中......)

标签: 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`;

太复杂?


推荐阅读