2011-02-23 110 views
3

我得到以下错误:如何跟踪PHP错误?

[23-Feb-2011 19:51:29] PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 512 bytes) in /obj/class.db.php on line 60 

我的问题是,我不知道这个错误发生。 class.db.php的第60行是我的应用程序(Database Read()函数)中最常用的函数之一。

如何追溯此错误源于哪里?

+1

你可能想看看:http://stackoverflow.com/questions/880458/php-memory-profiling – 2011-02-23 19:01:17

+0

你可以得到callstack ...试图搜索@ php.net? debug_backtrace http://php.net/manual/en/function.debug-backtrace.php其他好的信息方式是创建你自己的ExceptionHandlers ...例子在这里:http://www.edmondscommerce.co。uk/php/php-custom-error-and-exception-handler-make-php-stricter/ – 2013-03-13 14:23:00

回答

1

这很可能是问题发生的确切位置 - 脚本几乎全部吸收了128MB的限制,然后数据库类尝试分配更多空间来从数据库中读取某些内容,限制得以跨越,脚本栏。

你在做什么,需要使用128meg的内存?

+0

我明白这个错误的原因,但我不知道它究竟发生在哪里,因为该类的第60行使用了大约200在我的项目里面。 – Norwald2 2011-02-23 19:35:27

+0

你在做什么需要这么多的记忆? – 2011-02-23 19:37:52

+0

嗯,我不知道。我使用的是对象关系映射器,所以我没有完全手动控制它生成的SQL查询的内容。这就是为什么我需要追溯哪个SQL语句负责这个错误。 XDebug不是一个选项,因为我在托管服务器上,我不允许安装PHP扩展。 – Norwald2 2011-02-23 21:18:10

1

如果您正在运行内存,同时从数据库中选择数据,机会是你想一下子从DB抢了太多的数据,并试图加载它全部进入记忆。您的数据库读取()方法是否像自动获取数据并将其全部存入变量中?

您应该考虑逐步处理数据,以便一次抓取所有数据,或使用较小的数据集。另一方面,如果您有能力这样做,并且您确实需要一次处理大量数据,则可以考虑更改内存限制并使用ini_set('memory_limit', '256M');增加内存限制以将其增加到256MB。

参见:

http://php.net/manual/en/ini.core.php#ini.memory-limithttp://php.net/ini_set

编辑

搞清楚你是如何走到这一步的跟踪,Xdebug的可能是你最好的选择尽可能免费的解决方案担心。我会看看:http://www.xdebug.org/docs/execution_trace

xdebug.show_mem_delta选项可能是最有利于你找出什么是在查看堆栈跟踪时刺激你的内存使用情况。

+0

我明白这个错误的原因,但我不知道它究竟发生在何处,因为该类的第60行在我的项目中使用了大约200次。某处必须有一些SQL语句提取太多数据。我需要本地化它。我的数据库类没有问题。 – Norwald2 2011-02-23 19:35:47

+0

使用xdebug编辑添加一对特定项目。希望有所帮助。 – 2011-02-23 20:57:55

1

在php中,您可以设置您自己的异常处理程序和错误处理程序,另请参阅php.net上的文档。发生错误时,您可以打印回溯并将其转储到文件或屏幕。

看看PHP函数:

set_exception_handler() 
set_error_handler() 
debug_backtrace(); 

希望它能帮助, 格尔茨, 欧文Haantjes