php - 避免 fatal error 内存在它发生之前耗尽

标签 php error-handling out-of-memory

我试图通过确定它是否会在它实际发生之前发生来避免内存耗尽的 fatal error 。尽管我的 PHP 安装的内存限制为 128M,但允许的大小为 134217728 字节;我猜 PHP 在这里提供了一些空间来解释额外的字节。无论如何,我试图读取的实际文件大小是 134171737,小于 134217728。但是 PHP 说它试图分配 134179929。

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

fatal error :C:\xampp\htdocs\backup\vendor\cake\File.php 第 159 行 中允许的内存大小为 134217728 字节已用尽(尝试分配 134179929 字节)

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

最佳答案

您永远不应该尝试将总可用内存分配给您的运行时 - 这变得越来越真实,您的语言级别越高。

即使使用非常低级的语言(当然 PHP 不是),您不仅需要用于分配字节的内存(将进入堆空间),还需要用于指令和调​​用的内存堆。

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

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

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

关于php - 避免 fatal error 内存在它发生之前耗尽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42710443/

相关文章:

php - 在 Facebook 帖子中标记他人?

javascript - Internet Explorer jQuery错误

r - readxl(将excel文件导入R)错误

error-handling - 客户端错误监视是否捕获404和其他脚本/资源错误?

android - 房间内存不足错误 R(OOM)

php - 登录后通过 session 设置变量

php - 在 PHP 中编辑 .doc

java - 无尽的 ViewPager(不循环)

powershell - 在远程计算机上运行 Invoke-Command 时出现 OutOfMemory 错误

php - 执行mysqldump以sql格式备份数据库