2015-09-28 19 views
0

我的下載腳本中有一個間歇性錯誤,我無法用try/catch或以任何可靠性重現。我的500內部錯誤頁面在渲染時會記錄到我的系統中,它發生了。這裏是代碼塊,似乎在拋出錯誤(如下面的日誌所示)。如何記錄未被try/catch語句捕獲的間歇性錯誤?

$logger->addDebug("User downloading widget", $dl); 
header('Content-Description: File Transfer'); 
header('Content-type: application/octet-stream'); 
header('Content-length: '.filesize($dl['url'])); 
header('Content-Disposition: attachment; filename="'.str_replace('"', '_', $dl['name']).'"'); 
readfile($dl['url']); 

exit(); 

try/catch塊被圍繞它纏繞:

} catch (Exception $e) { 
    $logger->addCritical('DOWNLOAD ERROR ENCOUNTERED', array (
     errorMessage => $e->getMessage() 
    )); 

我的日誌示出了以下內容。注意第二個日誌是從我的500.php中獲得的日誌,並不是那裏的catch塊中的日誌。

[2015-09-27 13:21:15] Site DEBUG: User downloading widget { ... } 
[2015-09-27 13:21:16] Site CRITICAL: 500 INTERNAL SERVER ERROR { ... } 

的Apache/PHP配置爲登錄錯誤爲好,但也有那些匹配任何事件日誌中沒有相關的錯誤。

$dl['url']是存在於磁盤上的有效文件位置。 $dl['name']是嚴格控制的文件名值,僅存在字母數字(替換僅僅是一種安全措施)。在瀏覽器中使用確切的URL(以及情況可以打到這個代碼塊),我不會收到錯誤。

我已經把它包裝在一個try/catch塊中,它只是試圖記錄錯誤,但沒有從它那裏得到任何日誌結果,即使我仍然得到500錯誤日誌。所以現在我想我需要一個更通用的方法來獲得這個錯誤。 在500錯誤頁面(如.htaccess中設置)有沒有辦法獲取觸發頁面的服務器錯誤?或者,還有一個原因,爲什麼一個try/catch塊(它只是記錄錯誤)不起作用?

+0

添加如何配置錯誤日誌記錄到您的問題,請。 –

+0

那麼你是否解決了你的問題?您尚未顯示錯誤日誌記錄配置。 –

回答

0

您無法捕捉到異常,因爲沒有例外。只是一個錯誤。

500錯誤頁面沒有關於導致它顯示的錯誤的任何信息。但也有多種方法來顯示或記錄錯誤:

  1. 如果它不是一個生產基地,然後就使輸出錯誤的顯示。您可以在php.ini.htaccess或您的PHP腳本中執行此操作。搜索error_reportingdisplay_errors

  2. 如果是生產站點,則不應該向用戶顯示錯誤,所以改爲啓用錯誤日誌記錄。這些設置搜索log_errorserror_log。這些設置也可以在php.ini,.htaccess或您的PHOP腳本中設置。我建議你將它們設置爲php.ini.htaccess

  3. 你可以執行並設置一個custom error handler,它只是一個回調函數,當PHP發生錯誤時會調用它。在這個功能中,您可以獲得有關錯誤的所有信息(文件,行,消息,錯誤編號等),您可以在此執行任何操作。所以你可以例如實現你自定義的錯誤日誌。

注意:如果通過調用一個函數(或多個)設置任何在你的PHP腳本這些設置,並有一個語法錯誤某處腳本,因此它實際上不能被解析並執行,這些函數將不會執行,並且不會設置錯誤報告或日誌記錄。因此最好將其配置爲php.ini.htaccess

+0

這是一個生產站點,但我正在使用自定義500來添加其他日誌記錄。另外,我已經配置了apache來記錄錯誤,但是它沒有在error.log文件中記錄錯誤。此外,我還沒有親自重現這個錯誤,我只看到用戶點擊它的日誌和警報。 – Ktash

+0

好的,請添加如何配置錯誤日誌記錄到您的問題。 –

相關問題