php 異常處理函式 register_shutdown_function
阿新 • • 發佈:2018-12-27
register_shutdown_function() 表示 PHP 在程式結束時觸發某個函式行為。
如果僅僅是列印 log 日誌,我們在php.ini檔案中 log_error 開啟,即可寫入日誌。
此註冊函式是為了其他行為的方便操作,比如出現錯誤後程序自動抓取程式錯誤傳送給管理員郵件或者簡訊功能。
程式結束有四種情況:
- php程式碼執行過程中發生錯誤
- php程式碼順利執行成功
- php程式碼執行超時
- 頁面被使用者強制停止
以下情況不會執行回撥函式:
- 程式有語法錯誤;
- 呼叫register_shutdown_function函式呼叫之前發生了致命錯誤;
- 呼叫register_shutdown_function()函式之前有exit()函式呼叫,register_shutdown_function()函式將不能執行;
我們自定義一個行為:
<?php
/**
* Created by PhpStorm.
* User: Xavier
* Date: 2018/6/3
* Time: 12:16
*/
class RegisterShutDownFunction
{
/**
* @author Xavier
* @desc php 程式執行結束時候需要執行的函式
*/
public static function register()
{
if ($error = error_get_last()) {
// $filename 必須是一個絕對路徑
if (!defined('REGISTER_SHUTDOWN_FUNCTION_LOG_FILENAME')) {
$filename = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'register_shutdown_function.log';
} else {
$filename = REGISTER_SHUTDOWN_FUNCTION_LOG_FILENAME;
}
$message = '時間 : ' . date('Y-m-d H:i:s') . PHP_EOL;
$message .= '檔案 : ' . $error['file'] . PHP_EOL;
$message .= '行數 : ' . $error['line'] . PHP_EOL;
$message .= '錯誤 : ' . $error['message'] . PHP_EOL;
$message .= '型別 : ' . $error['type'] . PHP_EOL . PHP_EOL;
file_put_contents($filename, $message, FILE_APPEND);
}
}
}
接下來應用:
<?php
/**
* Created by PhpStorm.
* User: Xavier
* Date: 2018/6/3
* Time: 12:27
*/
// 定義一個常量來記錄程式停止後,出現錯誤的 LOG 日誌檔案
define('REGISTER_SHUTDOWN_FUNCTION_LOG_FILENAME', dirname(__FILE__) . DIRECTORY_SEPARATOR . '11.log');
// 包含異常處理的類檔案
include 'lib/RegisterShutDownFunction.php';
$registerShutDownFunction = new RegisterShutDownFunction();
// register_shutdown_function 函式必須在所有的程式執行之間註冊
register_shutdown_function(array($registerShutDownFunction, 'register'));
// 註冊成功之後呼叫一個不存在的方法 aa();
aa();
錯誤日誌:
時間 : 2018-06-03 04:56:02
檔案 : /Users/x/www/php/exception/2.php
行數 : 17
錯誤 : Uncaught Error: Call to undefined function aa() in /Users/x/www/php/exception/2.php:17
Stack trace:
#0 {main}
thrown
型別 : 1
錯誤日誌中的型別為錯誤級別,可以參照PHP報錯級別對照表