相关疑难解决方法(0)

你如何调试php"Out of Memory"问题?

我最近遇到了一些关于PHP内存限制的问题:

内存不足(分配22544384)(试图分配232个字节)

这些都是调试的麻烦,因为我没有留下关于导致问题的原因的大量信息.

添加关机功能有所帮助

register_shutdown_function('shutdown');
Run Code Online (Sandbox Code Playgroud)

然后,使用error_get_last(); 我可以获取有关上一个错误的信息,在这种情况下,"内存不足"致命错误,例如行号和php文件名.

这很好,但是我的php程序非常面向对象.堆栈深处的错误并没有告诉我有关错误时控制结构或执行堆栈的信息.我已经尝试过debug_backtrace(),但这只是在关机期间向我显示堆栈,而不是错误发生时的堆栈.

我知道我可以使用ini_set或修改php.ini来提高内存限制,但这并没有让我更接近实际找出消耗如此多内存的内容或错误期间执行流程的样子.

任何人都有一个很好的方法来调试高级面向对象的PHP程序中的内存错误?

php memory debugging methodology

29
推荐指数
4
解决办法
2万
查看次数

PHP内存不足,最后一次机会函数调用?

可能重复:
PHP致命错误:内存不足(已分配80740352)(尝试分配12352字节)

我们都知道这个错误:

Fatal error: Out of memory (allocated 32016932) (tried to allocate 25152 bytes)
Run Code Online (Sandbox Code Playgroud)

有办法处理这个错误吗?也许是执行的函数调用?这不是真正的堆栈溢出,它是系统强加的限制.人们会认为这里会有一点灵活性.我在本地缓存大量数据进行处理,但我有一个垃圾收集功能.我已经有功能设置来检查内存使用情况和可用内存是否超过一定限度,但我有时会错过.如果我可以在这个"致命"错误上调用我的函数......那么,在一个理想的世界中,程序应该能够恢复.

我的php.ini设置是memory_limit = 500M.

有什么想法吗?


非常感谢所有对此发表评论的人,但感谢@Wrikken提出的出色建议.

这是我最终做的事情:

declare(ticks=1);
register_tick_function('TickFunction');
function TickFunction() {
    if(memory_get_usage()>220000000) // 220M
    {
        GlobalDataStore::CheckMemory(); // my garbage collection function   
    }
}
Run Code Online (Sandbox Code Playgroud)

我的php.ini内存限制设置远远高于我想要运行的内存限制,并且tick函数负责内存监控并根据需要释放内存.

php

7
推荐指数
0
解决办法
136
查看次数

标签 统计

php ×2

debugging ×1

memory ×1

methodology ×1