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

41ik7eoe  于 2021-10-10  发布在  Java
关注(0)|答案(2)|浏览(366)

我尝试为我的php预加载脚本创建一个验证过程。
为了确保我没有未管理的类,我正在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

我收到了一个警告,因为该类中的一个无法满足缺少的依赖项。例如。:

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可能会失败。
我找不到相关的配置设置,自定义错误处理程序无法处理启动错误。

wkftcu5l

wkftcu5l1#

您可以实现自己的错误/异常处理。首先,您需要使用以下设置错误报告级别:

error_reporting (E_ALL);

然后,您可以实现两个简单的方法来处理所有发生的错误/异常。错误的方法如下所示:

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');
lnvxswe2

lnvxswe22#

实际上,我缺少的信息是,自定义错误处理程序必须在预加载文件中。
由于这主要是为了开发/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 因此,错误被捕获。
在生产环境中,我不承担将致命警告变成无害警告的风险(请记住,在本文中,警告主要是提供信息,即给定的文件不会预加载,不会对生产造成任何影响)。

相关问题