避免致命错误内存在发生之前耗尽

时间:2017-03-10 04:47:02

标签: php error-handling out-of-memory

我试图通过弄清楚它是否会在实际发生之前发生而避免内存耗尽致命错误。尽管我的PHP安装的mem限制为128M,但允许的大小为134217728字节;我猜PHP在这里提供了一些空间,这可以解释额外的字节数。在任何情况下,我试图读取的实际文件大小是134171737,小于134217728.但PHP说它试图分配134179929。

这些数字似乎是随意的。如果(通过比较即mem_size > file_size)这些数字实际上不准确,我如何检查读取变量文件是否会耗尽内存?

致命错误:第159行的C:\ xampp \ htdocs \ backup \ vendor \ cake \ File.php中允许的内存大小为134217728字节(尝试分配134179929字节)

注意:我知道我可以readfile。我很好奇在这种情况下如何避免这样的错误。

1 个答案:

答案 0 :(得分:0)

你永远不应该尝试将总可用内存分配给你的运行时 - 这越来越高,你的语言越高。

即使使用非常低级别的语言(当然,PHP也不是这样),您不仅需要内存用于分配的字节(将进入堆空间),而是需要内存。说明和调用堆栈。

当你进入更高级别和解释型语言时,这种开销只会增加 - 解释器将需要自己的内存量,并且可能没有任何好的或可靠的方式(无论是跨版本还是跨越各种配置相同配置中的相同版本或执行)以确定该环境/运行时需要多少“填充”。

在你的情况下,你已经怀疑你可能会接近 - 你应该选择一个“安全”的缓冲区空间来留给运行时,例如,如果你知道你将尝试分配超过90不应该运行的运行时的可用内存百分比(对于像PHP这样的语言,你很可能在其他消费者竞争相同资源的服务器环境中运行,该阈值可能会低得多)。

通常,避免消耗超过必要的内存是一种好习惯,尤其是在解释和基于Web的环境中。虽然内存权衡可能值得缩短执行时间(特别是在内存中加载更多数据时,可以节省大量重复计算的时间,重复分配内存需要更长时间,然后释放内存以仅重新分配),你在这里谈论的案例对此没有多大意义。这就是你更喜欢流模型的原因,你只需要分配尽可能少的内存来读取你可以合理服务的文件部分(而不是你必须重复处理该文件的不同部分的情况) ,然后根据刚处理的内容重新处理它们的某些部分 - 例如,必须经常在文件中回溯以了解下一步该做什么的例程。