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

Php 避免致命错误发生前内存耗尽,php,error-handling,out-of-memory,Php,Error Handling,Out Of Memory,我试图通过在它实际发生之前判断它是否会发生来避免内存耗尽的致命错误。尽管我的PHP安装有128M的内存限制,但允许的大小是134217728字节;我猜PHP在这里提供了一些空间,这就解释了额外的字节。无论如何,我尝试读取的实际文件大小是134171737,小于134217728。然而,PHP表示,它试图分配134179929 这些数字似乎是武断的。如果(通过比较,即mem\u size>file\u size)这些数字实际上不准确,如何检查将文件读取到变量是否会耗尽内存 致命错误:第159行的C

我试图通过在它实际发生之前判断它是否会发生来避免内存耗尽的致命错误。尽管我的PHP安装有128M的内存限制,但允许的大小是134217728字节;我猜PHP在这里提供了一些空间,这就解释了额外的字节。无论如何,我尝试读取的实际文件大小是134171737,小于134217728。然而,PHP表示,它试图分配134179929

这些数字似乎是武断的。如果(通过比较,即
mem\u size>file\u size
)这些数字实际上不准确,如何检查将文件读取到变量是否会耗尽内存

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


注意:我知道我可以做一个
readfile
。我只是想知道在这种情况下如何避免这样的错误。

您永远不应该尝试将总可用内存分配给您的运行时-您的语言级别越高,这一点就越正确

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

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

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


一般来说,避免消耗过多的内存是一种好的做法,特别是在解释型和基于web的环境中(特别是当在内存中加载更多数据时,将节省大量重复计算的时间,这将花费更长的时间重复分配内存,然后只为重新分配内存而取消分配内存),您在这里讨论的情况对此没有任何意义。这就是您喜欢流媒体模型的原因,在流媒体模型中,您只需要分配尽可能少的内存来读取您可以合理服务的文件部分(与您必须重复处理该文件的不同部分,然后根据刚刚处理的内容重新处理其中的某些部分的情况相反,例如,必须在文件中频繁回溯才能知道下一步要做什么的例程).

不确定您的问题是什么如果我读取一个文件到一个变量并回显该变量,并且如果文件大小大于mem限制,我可以在回显变量之前进行检查,从而避免mem耗尽错误。但是由于文件大小似乎无法确定分配的内存被卡住。您似乎已经知道答案-使用
filesize()
要首先检查文件大小,请确保为运行时/代码的其他部分需要的内存留出适当的填充空间…正是我的观点:如何确定适当的填充空间?因此,我说这些数字似乎是任意的。因为我已经读到文件内容使用了某种输出缓冲区,我认为这是原因g表示额外字节,但我似乎找不到任何文档说明如何确定一个n大小的文件的额外字节数。您首先必须将整个文件读入内存吗?