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
所以会发现错误。
- 在生产环境中,我不会冒将致命警告设为无害警告的风险(请记住,在这种情况下,警告主要是提供给定文件不会被预加载的信息,它对生产环境没有任何影响)。
我尝试为我的 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
所以会发现错误。 - 在生产环境中,我不会冒将致命警告设为无害警告的风险(请记住,在这种情况下,警告主要是提供给定文件不会被预加载的信息,它对生产环境没有任何影响)。