PHP: 如何使启动警告致命?

PHP: how to make startup warnings fatal?

我尝试为我的 PHP 预加载脚本进行验证。

为了确保我没有未管理的 classes 我是 运行 CLI 中的脚本,例如:

     php \
        -d error_reporting=2147483647 \
        -d opcache.enable_cli=1 \
        -d display_errors=1 \
        -d display_startup_errors=1 \
        -d memory_limit=96M \
        -d opcache.preload=preload.php \
         tools/utils/preload/check-preload.php

我收到一条警告,因为 class 之一由于缺少依赖项而无法遵守。例如:

Warning: Can't preload unlinked class User\Profile\ForceRegenerationDefaultAvatarCommand: Unknown parent Symfony\Component\Console\Command\Command in /home/mvacelet/workspace/tuleap/src/common/User/Profile/ForceRegenerationDefaultAvatarCommand.php on line 32

太好了,但我的问题是我无法将此警告设为致命警告。更具体地说,我希望 check-preload.php 脚本以不同于 0 的状态代码退出,这样我的 CI 就会失败。

我找不到相关的配置设置和自定义 error_handler 将无法使用启动错误。

您可以实施自己的 Error/Exception 处理。首先你需要设置错误报告级别:

error_reporting (E_ALL);

然后你可以实现两个简单的方法来处理所有发生的事情Errors/Exceptions。 Errors 的方法如下所示:

function handle_error ($number, $message, $file, $line, $context = null) {

    //change error to exception
    throw new ErrorException ($message, 0, $number, $file, $line);

}

异常处理方法如下所示:

function handle_exception (Throwable $exception) {

    //here you can check for warnings
    var_dump ($exception)

}

现在您只需将这些方法注册到:

set_error_handler ('handle_error');

set_exception_handler ('handle_exception');

实际上我缺少的信息是自定义错误处理程序必须在 preload 文件中。

因为这主要是为了 dev/CI 目的,以确保新开发产生的预加载不会产生警告,所以我做了一些更微妙的事情:

我现在有一个 verify-preload.php 文件:

    set_error_handler(static fn ($errno, $errstr, $errfile, $errline) => die("$errstr $errfile L$errline\n"), E_ALL);

    require __DIR__ . '/preload.php';

我的验证电话是:

     php \
        -d error_reporting=2147483647 \
        -d opcache.enable_cli=1 \
        -d display_errors=1 \
        -d display_startup_errors=1 \
        -d memory_limit=96M \
        -d opcache.preload=verify-preload.php \
         tools/utils/preload/check-preload.php

这样:

  • 在开发或 CI 期间,我依赖 verify-preload.php 所以会发现错误。
  • 在生产环境中,我不会冒将致命警告设为无害警告的风险(请记住,在这种情况下,警告主要是提供给定文件不会被预加载的信息,它对生产环境没有任何影响)。