joségonzalez/php-error-handlers

PHP 库,包含对流行错误处理服务的包装器

0.1.0 2017-06-18 08:18 UTC

This package is auto-updated.

Last update: 2024-08-29 04:14:07 UTC


README

Build Status Coverage Status Total Downloads Latest Stable Version

错误处理器

一个包含对流行错误处理服务包装器的包。

包含 CakePHP 3 的集成库。

要求

  • PHP 5.5+
  • 耐心

安装

# install it
composer require josegonzalez/php-error-handlers

用法

您可以将 Handler 类注册为 PHP 错误和异常的处理程序。

// Create an array of configuration data to pass to the handler class
$config = [
    'handlers' => [
        // *Can* be the class name, not-namespaced
        // The namespace will be "interpolated" in such cases
        'NewrelicHandler' => [
        ],
        // Can also include the full namespace
        'Josegonzalez\ErrorHandlers\Handler\BugsnagHandler' => [
            'apiKey' => 'YOUR_API_KEY_HERE'
        ],
        // Invalid handlers will be ignored
        'InvalidHandler' => [
        ],
    ],
];

// Register the error handler
(new \Josegonzalez\ErrorHandlers\Handler($config))->register();

// Enjoy throwing exceptions and reporting them upstream
throw new \Exception('Test Exception');

默认情况下,已注册的处理程序返回 false。这允许您链接错误处理程序,以便此包可以处理报告,而另一个库可以显示用户友好的错误消息。

可用的处理器

以下是一些内置处理器及其配置选项

  • AirbrakeHandler:: 使用官方的 airbrake php 包。
    • host: (可选 | 默认: api.airbrake.io) airbrake api 主机,例如:'api.airbrake.io' 或 'http://errbit.example.com'
    • projectId: (必需 | 默认: null)
    • projectKey: (必需 | 默认: null)
    • appVersion: (可选 | 默认: null)
    • environment: (可选 | 默认: null)
    • rootDirectory: (可选 | 默认: null)
    • httpClient: (可选 | 默认: null) 使用哪个 HTTP 客户端:"default", "curl", "guzzle" 或客户端实例
  • AtatusHandler: 使用 atatus php 扩展
    • apiKey: (可选 | 默认: null)
  • BugsnagHandler: 使用官方的 bugsnag php 包。
    • apiKey: (必需 | 默认: null)
    • defaults: (可选 | 默认: null) 企业用户的 bugsnag 端点
    • endpoint: (可选 | 默认: true) 如果我们应该注册默认的回调
  • MonologStreamHandler: 使用 monolog StreamHandler
    • name: (可选 | 默认: error)
    • handlerClass: (可选 | 默认: Monolog\Handler\StreamHandler)
    • stream: (可选 | 默认: log/error.log)
    • level: (可选 | 默认: Monolog\Logger::Warning)
  • NewrelicHandler: 使用 newrelic php 扩展
  • RaygunHandler: 使用官方的 raygun php 包。
    • apiKey: (必需 | 默认: null)
  • SentryHandler: 使用官方的 sentry php 包。
    • dsn: (必需 | 默认: null)
    • callInstall: (可选 | 默认: false) 是否调用客户端的 install 方法。

处理器和异常修改

修改客户端处理器

有时您可能会发现修改客户端很有用。例如,可能需要向给定的客户端调用添加上下文信息。要这样做,您可以设置 clientCallback 配置键

$config = [
    'handlers' => [
        'BugsnagHandler' => [
            'clientCallback' => function ($client) {
                // do something interesting to the client
                $client->setAppVersion('1.0.0');
                return $client;
            },
        ],
    ],
];

请注意,客户端仍然应该响应上游库提供的现有报告 API。如果您想的话,可以返回代理库,但返回初始客户端是理想的。

如果处理器配置不当,则 $client 可能会在 clientCallback 内部设置为 null

修改异常

如果需要,可以在特定的处理器内修改正在使用的异常。异常的更改只会持续到该特定处理器调用结束。

要这样做,为特定处理器设置exceptionCallback配置键。

$config = [
    'handlers' => [
        'BugsnagHandler' => [
            'exceptionCallback' => function ($exception) {
                // return null to skip reporting errors
                if ($exception instanceof \Error) {
                    return null;
                }
                return $exception;
            },
        ],
    ],
];

您可以返回另一个异常或null。在后一种情况下,内置处理器将跳过报告给定的异常。

自定义处理器

每个处理器应实现Josegonzalez\ErrorHandlers\Handler\HandlerInterface接口。此接口包含一个方法。

public function handle($exception);
  • 在发送到handle方法之前,PHP 5.x错误将被替换为包装的ErrorException实例。
  • 在发送到handle方法之前,PHP 7.x错误将替换为包装的Josegonzalez\ErrorHandlers\Exception\PHP7ErrorException实例。
  • 在发送到handle方法之前,PHP致命错误将被替换为包装的Josegonzalez\ErrorHandlers\Exception\FatalErrorException实例。
  • PHP异常将保持不变发送。

自定义处理器应该扩展提供的Josegonzalez\ErrorHandlers\Handler\AbstractHandler类。这使它们能够通过提供的ConfigTrait和自定义的__construct()接收配置。

CakePHP用法

加载库是不必要的,并且会导致错误。请按照以下说明进行cakephp特定的配置。

您可能需要在您的config/app.php中设置以下配置键。

  • Error.config:接受与您为常规php使用提供的相同配置数组。

接下来,在您的config/bootstrap.php中配置提供的ErrorHandler类。

// around line 100
$isCli = PHP_SAPI === 'cli';
if ($isCli) {
    (new \Josegonzalez\ErrorHandlers\Cake\ConsoleErrorHandler(Configure::read('Error')))->register();
} else {
    (new \Josegonzalez\ErrorHandlers\Cake\ErrorHandler(Configure::read('Error')))->register();
}