我正在尋找一個掛鉤或某種方式來輕鬆發送電子郵件,每當我在mediawiki上發生數據庫錯誤時。我意識到我可能不得不將這個功能添加到他們的數據庫類中,但目前我不確定是否應該這樣做。如何讓mediawiki在每個數據庫錯誤上給我發電子郵件?
我不想要一個解決方案,其中包括守護進程,crons或其他任何會根據SQL查詢日誌讀取和發送電子郵件的解決方案。
我正在尋找一個掛鉤或某種方式來輕鬆發送電子郵件,每當我在mediawiki上發生數據庫錯誤時。我意識到我可能不得不將這個功能添加到他們的數據庫類中,但目前我不確定是否應該這樣做。如何讓mediawiki在每個數據庫錯誤上給我發電子郵件?
我不想要一個解決方案,其中包括守護進程,crons或其他任何會根據SQL查詢日誌讀取和發送電子郵件的解決方案。
這樣做的唯一可行的方法可能是註冊自定義異常處理程序。在那裏我們檢查異常是否是數據庫錯誤並相應地發送電子郵件。
我想出這個簡單的代碼:
$wgHooks['SetupAfterCache'][] = 'onSetupAfterCache';
function onSetupAfterCache() {
set_exception_handler('customExceptionHandler');
return true;
}
首先,我們必須建立一個鉤子來註冊我們的異常處理程序。如果我們在LocalSettings.php
中註冊它,它將被覆蓋wfInstallExceptionHandler()
。
function customExceptionHandler($e) {
if($e instanceof DBError) {
$from = new MailAddress('[email protected]');
$to = new MailAddress('[email protected]');
$body = 'A database error occured on My Wiki. Details follow:' . "\n\n" .
$e->getText();
UserMailer::send($to, $from, 'Database error on My Wiki', $body);
}
在這裏,我們檢查是否異常是由數據庫引起併發送電子郵件。您應該自定義$from
,$to
和$body
變量。有關UserMailer
和MailAddress
類的更多信息,請參閱文檔。
wfExceptionHandler($e);
}
最後,我們將例外傳遞給MediaWiki的處理程序,我們之前已經重寫了該處理程序。它負責將錯誤輸出給用戶和其他重要的東西。
做這個方法也會捕獲警告和致命錯誤以及db錯誤,對嗎? (不是我介意的) – 2011-04-21 19:44:29
這隻會捕獲異常,只發生在致命錯誤上,如語法或連接錯誤。 – 2011-04-21 19:55:55
爲什麼你不應該那樣做?這意味着如果更新MediaWiki,則必須再次更改該類,所以請注意這一點。 – 2011-04-11 21:57:07