亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何通過電子郵件發送所有 PHP 異常/錯誤的詳細信息,包括 mysqli 的?

如何通過電子郵件發送所有 PHP 異常/錯誤的詳細信息,包括 mysqli 的?

PHP
慕后森 2023-05-26 17:12:15
如何獲得所有 PHP 異常,包括 mysqli 生成的異常和普通 php 異常,并通過電子郵件發送給我?問題環境我在我的 ISP 處使用共享服務器,無法訪問任何管理類型的 PHP 配置文件。在服務器上,我只有大約一百行 PHP 來對 MySQL 數據庫執行查詢,如果返回任何行,它會執行一些 SQL UPDATE 命令。這作為 cron 作業每天運行。沒有關聯的網站(我在該服務器上什至沒有網站)。服務器托管一個用于遠程連接的數據庫,而 php 只是對其執行一些維護。由于沒有“用戶”和“網頁”來提供反饋,我希望所有錯誤和異常都通過電子郵件發送給我。我嘗試/研究過的事情我發現mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);將通常導致返回 FALSE 的 mysqli 錯誤轉換為將寫入錯誤日志的異常。這有幫助。...我可以使用例如電子郵件發送文本$email = "my message";Error_log($email, 1, "[email protected]", "From: [email protected]");  并且我可以通過編寫自己的錯誤處理程序來獲取錯誤的詳細信息,例如function the_error_handler($number, $message, $file, $line, $vars) //putting $vars in shows all the variables the server knows about{    $email = " An error ($number) occurred on line $line in $file.  $message ";    Error_log($email, 1, "[email protected]", "From: [email protected]");    };并使用它進行設置set_error_handler('the_error_handler'); 最小的,可重現的例子在下面的代碼中,我將所有這些放在一起并故意引入了兩個錯誤(試圖回顯一個不存在的變量并試圖在一個不存在的表上執行查詢。
查看完整描述

1 回答

?
翻閱古今

TA貢獻1780條經驗 獲得超5個贊

首先,我必須警告您,在一個向公眾開放的實時站點上,電子郵件錯誤可能會淹沒您的郵箱,以防萬一出現嚴重故障,因為對站點的每個請求都會導致發送一封不同的電子郵件。在我工作的公司中,這種情況不止一次發生過。有時很難在錯誤的瀑布中找到真正的原因。

監控服務器日志被認為是更安全和準確的解決方案。事實證明,在錯誤日志上使用 Grep 比瀏覽電子郵件更有效。但無論哪種方式,這里的問題是如何統一處理所有錯誤,而處理程序中采取的操作可以是任何操作。

錯誤和異常是不同的野獸,每個都有自己的處理程序。因此,要使錯誤處理統一,您必須首先將錯誤轉換為異常,然后在異常處理程序中執行所需的處理,無論它是什么——日志記錄、電子郵件或任何東西。

因此,您將需要本文中介紹的兩個功能,即簡單地將錯誤轉換為異常的錯誤處理程序,

set_error_handler(function ($level, $message, $file = '', $line = 0)

{

? ? throw new ErrorException($message, 0, $level, $file, $line);

});

和這樣的異常處理程序


set_exception_handler(function ($e)

{

? ? error_log($e);

? ? http_response_code(500);

? ? if (ini_get('display_errors')) {

? ? ? ? echo $e;

? ? } else {

? ? ? ? error_log($e, 1, "[email protected]", "From: [email protected]");

? ? ? ? echo "<h1>500 Internal Server Error</h1>

? ? ? ? ? ? ? An internal server error has been occurred.<br>

? ? ? ? ? ? ? Please try again later.";

? ? }

});

每次發生錯誤并且代碼在實時站點上運行時,它都會向您發送一封電子郵件。


此外,您可能希望添加一個致命錯誤處理程序,它可能有助于處理同名錯誤??梢栽谖恼轮锌吹剿腥齻€處理程序組合在一起的完整示例。


關于mysqli,你是絕對正確的,下面一行


?mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

將告訴 mysqli 拋出異常,這些異常將由上面定義的處理程序處理。


查看完整回答
反對 回復 2023-05-26
  • 1 回答
  • 0 關注
  • 171 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號