2011-02-23 124 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