第六章-PHP错误处理

发布于:2025-03-19 ⋅ 阅读:(10) ⋅ 点赞:(0)

PHP错误处理

一,错误处理的基本概念:

1. 错误类型

PHP中的错误主要分为以下几类:

  • 致命错误 (Fatal Errors): 这些错误会导致脚本终止执行。例如,调用未定义的函数或类。
  • 警告 (Warnings): 这些错误不会终止脚本执行,但指示有问题需要解决。例如,包含一个不存在的文件。
  • 通知 (Notices): 这些是非致命的提示,通常不会影响脚本的执行。例如,访问未定义的变量。
  • 解析错误 (Parse Errors): 这些错误发生在脚本解析阶段,通常是由于语法错误引起的。

2. 错误报告级别

PHP提供了不同的错误报告级别,可以通过error_reporting()函数来设置:

  • E_ALL: 报告所有错误和警告。
  • E_ERROR: 只报告致命错误。
  • E_WARNING: 只报告警告。
  • E_NOTICE: 只报告通知。
  • E_PARSE: 只报告解析错误。

例如,设置报告所有错误:

error_reporting(E_ALL);

3. 错误处理函数

PHP提供了几个内置函数来处理错误:

  • error_reporting(): 设置错误报告级别。
  • set_error_handler(): 设置用户自定义的错误处理函数。
  • trigger_error(): 触发一个用户级别的错误/警告/通知。
  • restore_error_handler(): 恢复之前的错误处理函数。

4. 自定义错误处理

你可以通过set_error_handler()函数来定义自己的错误处理函数:

function customErrorHandler($errno, $errstr, $errfile, $errline) {
    echo "<b>Error:</b> [$errno] $errstr<br>";
    echo "Error on line $errline in $errfile<br>";
}

set_error_handler("customErrorHandler");

5. 异常处理

PHP还支持异常处理,使用trycatchthrow语句:

try {
    // 代码块
    throw new Exception("An error occurred");
} catch (Exception $e) {
    echo "Caught exception: " . $e->getMessage();
}

6. 日志记录

你可以将错误记录到日志文件中,而不是直接显示给用户:

ini_set("log_errors", 1);
ini_set("error_log", "/path/to/your/error.log");

7. 关闭错误显示

在生产环境中,通常不希望将错误信息显示给用户,可以通过以下设置关闭错误显示:

ini_set("display_errors", 0);

8. 错误处理最佳实践

  • 开发环境: 显示所有错误,便于调试。
  • 生产环境: 关闭错误显示,记录错误日志,避免暴露敏感信息。
  • 自定义错误页面: 为用户提供友好的错误页面,而不是显示技术细节。

二,错误的分类

1. 致命错误 (Fatal Errors)

  • 特征:

    • 脚本会立即终止执行。
    • 通常是由于严重的逻辑问题或资源不可用引起的。
  • 常见场景:

    • 调用未定义的函数或类。
    • 使用未定义的常量。
    • 内存不足。
  • 示例:

    undefinedFunction(); // 调用未定义的函数
    

    错误信息:

    Fatal error: Uncaught Error: Call to undefined function undefinedFunction()
    

2. 解析错误 (Parse Errors)

  • 特征:

    • 发生在脚本解析阶段,代码未执行。
    • 通常是由于语法错误引起的。
  • 常见场景:

    • 缺少分号、括号或引号。
    • 使用了无效的语法。
  • 示例:

    echo "Hello, world" // 缺少分号
    

    错误信息:

    Parse error: syntax error, unexpected end of file
    

3. 警告 (Warnings)

  • 特征:

    • 不会终止脚本执行,但指示有问题需要解决。
    • 通常是由于逻辑问题或资源问题引起的。
  • 常见场景:

    • 包含不存在的文件。
    • 使用未定义的变量。
    • 函数参数不正确。
  • 示例:

    include("nonexistent_file.php"); // 包含不存在的文件
    

    错误信息:

    Warning: include(nonexistent_file.php): failed to open stream: No such file or directory
    

4. 通知 (Notices)

  • 特征:

    • 非致命的提示,通常不会影响脚本执行。
    • 通常是由于代码不够严谨引起的。
  • 常见场景:

    • 访问未定义的变量。
    • 访问未定义的数组键。
  • 示例:

    echo $undefinedVariable; // 访问未定义的变量
    

    错误信息:

    Notice: Undefined variable: undefinedVariable
    

5. 已弃用错误 (Deprecated Errors)

  • 特征:

    • 提示某些功能或语法在未来版本中将被移除。
    • 不会终止脚本执行。
  • 常见场景:

    • 使用过时的函数或语法。
  • 示例:

    mysql_connect(); // 使用已弃用的MySQL扩展
    

    错误信息:

    Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future
    

6. 用户自定义错误 (User Errors)

  • 特征:

    • 由开发者使用trigger_error()函数手动触发的错误。
    • 可以是E_USER_ERRORE_USER_WARNINGE_USER_NOTICE级别。
  • 常见场景:

    • 在特定条件下触发错误以提醒开发者。
  • 示例:

    if ($value > 100) {
        trigger_error("Value is too high", E_USER_WARNING);
    }
    

    错误信息:

    Warning: Value is too high
    

7. 异常 (Exceptions)

  • 特征:

    • throw关键字抛出的错误。
    • 可以通过try-catch块捕获和处理。
    • 不会自动终止脚本,除非未被捕获。
  • 常见场景:

    • 自定义错误处理逻辑。
    • 处理外部资源(如数据库、API)的错误。
  • 示例:

    php

    try {
        throw new Exception("An error occurred");
    } catch (Exception $e) {
        echo "Caught exception: " . $e->getMessage();
    }
    

    输出:

    Caught exception: An error occurred
    

8. 核心错误 (Core Errors)

  • 特征:

    • 由PHP引擎内部引发的错误。
    • 通常是严重的系统级错误。
  • 常见场景:

    • 内存不足。
    • 文件系统错误。
  • 示例:

    Fatal error: Out of memory (allocated 12345678)
    

9. 编译时错误 (Compile-Time Errors)

  • 特征:

    • 在脚本编译阶段发生的错误。
    • 通常是语法错误或配置问题。
  • 常见场景:

    • 使用了无效的PHP配置。
    • 脚本文件损坏。
  • 示例:

    Compile error: Cannot redeclare class MyClass
    

10. 运行时错误 (Runtime Errors)

  • 特征:

    • 在脚本执行期间发生的错误。
    • 通常是逻辑错误或资源问题。
  • 常见场景:

    • 文件不存在。
    • 数据库连接失败。
  • 示例:

    Warning: Division by zero
    

总结

错误类型 特征 是否终止脚本
致命错误 严重错误,脚本立即终止
解析错误 语法错误,脚本未执行
警告 非致命错误,脚本继续执行
通知 非致命提示,脚本继续执行
已弃用错误 提示功能将被移除,脚本继续执行
用户自定义错误 由开发者手动触发,脚本可能终止(取决于级别) 可能
异常 throw抛出,可通过try-catch捕获
核心错误 系统级错误,通常严重
编译时错误 脚本编译阶段错误
运行时错误 脚本执行期间错误 可能

三,错误的触发

1. PHP引擎自动触发的错误

PHP引擎会在代码执行过程中自动检测并触发错误。以下是一些常见的场景:

1.1 语法错误(解析错误)
  • 触发条件: 代码中存在语法问题。

  • 示例:

    echo "Hello, world" // 缺少分号
    

    错误信息:

    Parse error: syntax error, unexpected end of file
    
1.2 运行时错误
  • 触发条件: 代码逻辑问题或资源不可用。

  • 示例:

    echo 10 / 0; // 除以零
    

    错误信息:

    复制

    Warning: Division by zero
    
1.3 致命错误
  • 触发条件: 严重错误导致脚本无法继续执行。

  • 示例:

    undefinedFunction(); // 调用未定义的函数
    

    错误信息:

    Fatal error: Uncaught Error: Call to undefined function undefinedFunction()
    

2. 开发者手动触发的错误

PHP提供了trigger_error()函数,允许开发者手动触发错误。可以根据需要触发不同级别的错误。

2.1 触发用户警告 (E_USER_WARNING)
  • 示例:

    if ($value > 100) {
        trigger_error("Value is too high", E_USER_WARNING);
    }
    

    错误信息:

    Warning: Value is too high
    
2.2 触发用户通知 (E_USER_NOTICE)
  • 示例:

    if (!isset($variable)) {
        trigger_error("Variable is not set", E_USER_NOTICE);
    }
    

    错误信息:

    Notice: Variable is not set
    
2.3 触发用户致命错误 (E_USER_ERROR)
  • 示例:

    if ($value < 0) {
        trigger_error("Invalid value", E_USER_ERROR);
    }
    

    错误信息:

    Fatal error: Invalid value
    

3. 异常 (Exceptions)

PHP支持面向对象的异常处理机制,开发者可以通过throw关键字手动抛出异常。

3.1 抛出异常
  • 示例:

    function divide($a, $b) {
        if ($b == 0) {
            throw new Exception("Division by zero is not allowed");
        }
        return $a / $b;
    }
    
    try {
        echo divide(10, 0);
    } catch (Exception $e) {
        echo "Caught exception: " . $e->getMessage();
    }
    

    输出:

    Caught exception: Division by zero is not allowed
    
3.2 自定义异常类
  • 示例:

    class CustomException extends Exception {
        public function errorMessage() {
            return "Custom Exception: " . $this->getMessage();
        }
    }
    
    try {
        throw new CustomException("Something went wrong");
    } catch (CustomException $e) {
        echo $e->errorMessage();
    }
    

    输出:

    复制

    Custom Exception: Something went wrong
    

4. 使用 assert() 触发错误

assert()函数用于检查某个条件是否为真,如果条件为假,则会触发错误。

4.1 基本用法
  • 示例:

    assert(2 + 2 == 5, "Math is broken!");
    

    错误信息:

    Warning: assert(): Math is broken! failed
    
4.2 配置断言行为

可以通过ini_set()配置断言的行为:

  • 禁用断言:

    ini_set('assert.active', 0);
    
  • 将断言转换为异常:

    ini_set('assert.exception', 1);
    

5. 使用 error_log() 记录错误

error_log()函数可以将错误信息记录到日志文件中,而不是直接显示给用户。

5.1 记录错误到文件
  • 示例:

    error_log("An error occurred", 3, "/path/to/error.log");
    

    效果:
    将错误信息写入指定文件。

5.2 发送错误到系统日志
  • 示例:

    error_log("System error", 0);
    

    效果:
    将错误信息发送到系统日志。


6. 使用 set_error_handler() 自定义错误处理

开发者可以通过set_error_handler()函数定义自定义的错误处理函数,以替代PHP默认的错误处理机制。

6.1 自定义错误处理函数
  • 示例:

    function customErrorHandler($errno, $errstr, $errfile, $errline) {
        echo "<b>Error:</b> [$errno] $errstr<br>";
        echo "Error on line $errline in $errfile<br>";
    }
    
    set_error_handler("customErrorHandler");
    
    echo $undefinedVariable; // 触发自定义错误处理
    

    输出:

    Error: [8] Undefined variable: undefinedVariable
    Error on line 10 in /path/to/file.php
    

总结

触发方式 描述 示例
PHP引擎自动触发 由PHP引擎检测到的错误(如语法错误、运行时错误) echo 10 / 0;
trigger_error() 开发者手动触发错误(警告、通知、致命错误) trigger_error("Value is too high", E_USER_WARNING);
异常 (throw) 开发者手动抛出异常 throw new Exception("An error occurred");
assert() 检查条件是否为真,触发错误 assert(2 + 2 == 5, "Math is broken!");
error_log() 记录错误到日志文件或系统日志 error_log("An error occurred", 3, "/path/to/error.log");
set_error_handler() 自定义错误处理函数 set_error_handler("customErrorHandler");

四,错误显示设置

1. 配置php.ini文件(全局设置)

开发环境配置:

error_reporting = E_ALL
display_errors = On
display_startup_errors = On
log_errors = On
error_log = /path/to/php_error.log

生产环境配置:

error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
display_errors = Off
display_startup_errors = Off
log_errors = On
error_log = /var/log/php_errors.log

说明:

  • error_reporting:定义报告的错误级别。E_ALL 显示所有错误(开发),生产环境可调整。
  • display_errors:控制是否在输出中显示错误。
  • display_startup_errors:显示启动期间发生的错误(需在php.ini设置,脚本中无法修改)。
  • log_errorserror_log:启用日志记录并指定路径。

2. 在脚本中动态设置

在PHP文件开头添加(适用于开发调试):

<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
// display_startup_errors 无法通过ini_set()设置
ini_set('log_errors', '1');
ini_set('error_log', '/tmp/php_errors.log');

注意: display_startup_errors 必须在php.ini或.htaccess中设置。

3. 使用.htaccess(Apache服务器)

若无法修改php.ini,可在项目根目录的.htaccess中添加:

php_flag display_errors on
php_value error_reporting 32767  # 对应E_ALL
php_flag log_errors on
php_value error_log /path/to/error.log

4. 错误级别常量

  • E_ALL:所有错误和警告(PHP5.4+包含E_STRICT)。
  • E_ERROR:致命运行时错误。
  • E_WARNING:非致命运行时警告。
  • E_NOTICE:运行时提示(可能的问题)。
  • E_STRICT:代码标准化建议(PHP5+)。

5. 环境区分

通过环境变量自动切换配置:

<?php
if (getenv('ENVIRONMENT') === 'development') {
    error_reporting(E_ALL);
    ini_set('display_errors', '1');
} else {
    error_reporting(E_ERROR | E_WARNING | E_PARSE);
    ini_set('display_errors', '0');
}

6. 框架配置

如Laravel或Symfony等框架通常有自己的配置文件和异常处理:

  • Laravel:修改.env中的APP_DEBUG=true并配置config/app.php
  • Symfony:在.env设置APP_ENV=devAPP_DEBUG=1

7. 验证配置

创建测试脚本:

<?php
// 未定义变量触发Notice
echo $undefinedVar;
// 调用不存在函数触发Fatal Error
nonExistentFunction();
  • 开发环境应显示错误详情。
  • 生产环境应无错误显示,但日志中记录。

8. 注意事项

  • PHP版本差异:PHP 8.0+中E_ALL包含更多错误类型。
  • 共享主机限制:可能需要使用.htaccess或联系提供商。
  • 安全性:生产环境务必关闭display_errors,避免信息泄露。

总结步骤

开发环境:

  1. 修改php.ini,开启display_errorsdisplay_startup_errors
  2. 设置error_reporting(E_ALL)
  3. 可选:配置错误日志路径。

生产环境:

  1. 关闭display_errorsdisplay_startup_errors
  2. 调整error_reporting减少冗余日志。
  3. 确保log_errors开启并监控日志文件。

五,错误日志设置

1. 基础配置(php.ini 或脚本)

全局配置(php.ini)
; 启用错误日志记录
log_errors = On

; 指定日志文件路径(确保目录可写)
error_log = /var/log/php_errors.log

; 记录所有错误(开发环境)
error_reporting = E_ALL

; 生产环境建议调整错误级别(避免冗余日志)
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED
动态脚本设置

在 PHP 文件开头通过代码配置:

<?php
// 设置错误报告级别
error_reporting(E_ALL);

// 开启错误日志
ini_set('log_errors', 1);

// 自定义日志路径(需确保目录权限)
ini_set('error_log', '/path/to/custom_php_errors.log');

2. 环境区分配置

根据开发/生产环境动态调整:

<?php
if ($_SERVER['ENVIRONMENT'] === 'production') {
    ini_set('display_errors', 0);
    ini_set('log_errors', 1);
    error_reporting(E_ERROR | E_WARNING | E_PARSE);
} else {
    ini_set('display_errors', 1);
    error_reporting(E_ALL);
}

3. 日志文件权限

  • 确保 PHP 进程有写入权限

    # 修改日志文件权限(示例)
    chmod 644 /var/log/php_errors.log
    chown www-data:www-data /var/log/php_errors.log  # Apache/Nginx 用户组
    

4. 日志轮转(避免文件过大)

使用 logrotate 工具定期切割日志(示例配置 /etc/logrotate.d/php):

/var/log/php_errors.log {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    notifempty
    create 644 www-data www-data
    postrotate
        /etc/init.d/apache2 reload > /dev/null  # 或重启 PHP-FPM
    endscript
}

5. 自定义错误处理

通过 PHP 代码捕获错误并记录到日志:

<?php
// 自定义错误处理函数
function customErrorHandler($errno, $errstr, $errfile, $errline) {
    $logMessage = "[$errno] $errstr in $errfile on line $errline";
    error_log($logMessage, 3, '/path/to/custom_errors.log');
    return true; // 阻止默认错误处理
}

// 注册自定义错误处理器
set_error_handler("customErrorHandler");

// 捕获致命错误(如语法错误)
register_shutdown_function(function() {
    $error = error_get_last();
    if ($error && in_array($error['type'], [E_ERROR, E_PARSE, E_CORE_ERROR])) {
        error_log("[FATAL] {$error['message']} in {$error['file']} on line {$error['line']}", 3, '/path/to/custom_errors.log');
    }
});

6. 框架集成(如 Laravel)

  • Laravel:通过 .env 文件配置:

    APP_DEBUG=false
    LOG_CHANNEL=stack
    LOG_LEVEL=debug  # 可选:debug, info, notice, warning, error, critical
    

    日志文件默认存储在 storage/logs/laravel.log

  • Symfony:修改 config/packages/prod/monolog.yaml

    monolog:
        handlers:
            main:
                type: fingers_crossed
                action_level: error
                handler: nested
                path: "%kernel.logs_dir%/%kernel.environment%.log"
    

7. 验证日志设置

创建测试脚本 test_error.php

<?php
// 触发一个警告
echo $undefinedVariable;

// 触发一个致命错误(如调用不存在的函数)
nonExistentFunction();

运行后检查日志文件:

tail -f /var/log/php_errors.log

8. 注意事项

  1. 安全性
    • 生产环境务必关闭 display_errorsdisplay_startup_errors
    • 确保日志文件不可通过 Web 访问(避免路径在公共目录)。
  2. 性能优化
    • 高频日志写入可能影响性能,建议异步日志处理(如使用 syslog 或第三方服务)。
  3. 监控
    • 使用工具(如 logwatchSentryELK Stack)监控日志。

总结配置

场景 display_errors log_errors error_reporting 日志路径
开发环境 On On E_ALL 本地文件或终端输出
生产环境 Off On E_ALL & ~NOTICE & ~DEPRECATED 安全目录(如 /var/log

六,自定义错误处理

1. 基础错误处理函数

通过 set_error_handler() 接管非致命错误:

<?php
// 定义自定义错误处理函数
function customErrorHandler(
    int $errno,        // 错误级别(如 E_WARNING)
    string $errstr,    // 错误描述
    string $errfile,   // 触发错误的文件
    int $errline       // 错误行号
): bool {
    // 定义错误类型映射
    $errorTypes = [
        E_ERROR             => 'Fatal Error',
        E_WARNING           => 'Warning',
        E_PARSE             => 'Parse Error',
        E_NOTICE            => 'Notice',
        E_CORE_ERROR        => 'Core Error',
        E_CORE_WARNING      => 'Core Warning',
        E_COMPILE_ERROR     => 'Compile Error',
        E_COMPILE_WARNING   => 'Compile Warning',
        E_USER_ERROR       => 'User Error',
        E_USER_WARNING     => 'User Warning',
        E_USER_NOTICE       => 'User Notice',
        E_STRICT           => 'Strict',
        E_RECOVERABLE_ERROR => 'Recoverable Error',
        E_DEPRECATED        => 'Deprecated',
        E_USER_DEPRECATED  => 'User Deprecated'
    ];

    // 获取可读的错误类型名称
    $errorType = $errorTypes[$errno] ?? 'Unknown Error';

    // 构建日志消息
    $logMessage = sprintf(
        "[%s] %s in %s on line %d\n",
        $errorType,
        $errstr,
        $errfile,
        $errline
    );

    // 记录到文件
    error_log($logMessage, 3, '/var/log/php_custom_errors.log');

    // 返回 true 表示已处理错误,阻止默认处理
    return true;
}

// 注册自定义错误处理器
set_error_handler('customErrorHandler', E_ALL);

2. 捕获致命错误

由于 E_ERROR 等致命错误无法通过 set_error_handler 捕获,需使用 register_shutdown_function

<?php
// 捕获致命错误(如 E_ERROR, E_PARSE)
register_shutdown_function(function() {
    $lastError = error_get_last();

    if ($lastError && in_array($lastError['type'], [
        E_ERROR,
        E_PARSE,
        E_CORE_ERROR,
        E_COMPILE_ERROR,
        E_USER_ERROR
    ])) {
        // 调用自定义处理逻辑
        customErrorHandler(
            $lastError['type'],
            $lastError['message'],
            $lastError['file'],
            $lastError['line']
        );

        // 可选:输出友好错误页面
        echo "<h1>服务器内部错误,请稍后重试</h1>";
        // 或重定向
        // header('Location: /500.html');
        exit;
    }
});

3. 自定义异常处理

结合异常处理统一管理错误:

<?php
// 自定义异常处理器
function customExceptionHandler(Throwable $e): void {
    $logMessage = sprintf(
        "[Exception] %s in %s on line %d\nStack Trace:\n%s\n",
        $e->getMessage(),
        $e->getFile(),
        $e->getLine(),
        $e->getTraceAsString()
    );

    error_log($logMessage, 3, '/var/log/php_exceptions.log');

    // 生产环境隐藏详细信息
    if (ini_get('display_errors') === '0') {
        echo "发生意外错误,请联系管理员";
    } else {
        echo "<pre>$logMessage</pre>";
    }
}

// 注册全局异常处理器
set_exception_handler('customExceptionHandler');

// 示例:抛出异常
throw new RuntimeException("测试自定义异常");

4. 高级功能扩展

4.1 错误分级处理
function customErrorHandler(int $errno, string $errstr, ...) {
    switch ($errno) {
        case E_USER_ERROR:
            // 发送邮件通知管理员
            mail('admin@example.com', '严重错误', $errstr);
            break;
        case E_WARNING:
            // 记录到单独日志
            error_log(..., '/var/log/php_warnings.log');
            break;
        default:
            error_log(..., '/var/log/php_others.log');
    }
    return true;
}
4.2 错误页面模板
function renderErrorPage(int $code, string $message): void {
    http_response_code($code);
    include "templates/{$code}.html";
    exit;
}

// 在 shutdown 函数中调用
renderErrorPage(500, '内部服务器错误');
4.3 日志自动分割
// 按日期生成日志文件名
$logFile = sprintf(
    '/var/log/php_errors/%s.log',
    date('Y-m-d')
);
error_log($logMessage, 3, $logFile);

5. 与框架集成

Laravel 自定义处理器

修改 app/Exceptions/Handler.php

public function register() {
    $this->reportable(function (Throwable $e) {
        // 自定义报告逻辑
        Log::channel('slack')->error($e->getMessage());
    });

    $this->renderable(function (Throwable $e) {
        return response()->view('errors.custom', [], 500);
    });
}
Symfony 异常监听器

创建 src/EventListener/ExceptionListener.php

class ExceptionListener {
    public function onKernelException(ExceptionEvent $event) {
        $exception = $event->getThrowable();
        // 记录到数据库
        $this->logToDatabase($exception);
        // 返回 JSON 响应
        $event->setResponse(new JsonResponse([
            'error' => $exception->getMessage()
        ], 500));
    }
}

6. 验证与调试

测试脚本:

<?php
// 触发不同级别错误
trigger_error("测试警告", E_USER_WARNING); // 触发自定义警告
trigger_error("测试致命错误", E_USER_ERROR); // 触发自定义致命错误

// 未定义变量触发 Notice
echo $undefinedVar;

// 调用不存在的方法
(new stdClass)->nonExistentMethod();

检查日志文件内容:

[Warning] 测试警告 in /path/to/test.php on line 3
[User Error] 测试致命错误 in /path/to/test.php on line 4
[Notice] Undefined variable: undefinedVar in /path/to/test.php on line 7
[Fatal Error] Call to undefined method stdClass::nonExistentMethod() in /path/to/test.php on line 10

7. 注意事项

  1. 错误控制符 @
    使用 @ 抑制错误时,仍需在自定义处理器中检查 error_reporting()

    if (!(error_reporting() & $errno)) {
        return false; // 执行默认处理
    }
    
  2. 恢复默认处理
    临时恢复系统默认处理:

    restore_error_handler();
    restore_exception_handler();
    
  3. 性能优化

    • 高频错误处理中避免复杂逻辑
    • 使用 fastcgi_finish_request() 延迟处理非关键错误
  4. 安全日志

    • 避免记录敏感信息(如密码)
    • 对日志文件设置严格权限(chmod 600

通过自定义错误处理,可以实现:

  • 统一错误日志格式
  • 按错误级别分类处理
  • 集成第三方监控服务(如 Sentry、New Relic)
  • 提升用户体验(友好错误页面)
  • 增强系统安全性(隐藏技术细节)