如何禁用致命错误(WSOD)保护?

时间:2019-05-08 作者:birgire

WordPress 5.1和5.2中引入了致命错误处理。

它有时被称为白屏死亡保护(WSOD)。

在进行开发/本地安装时,我们有时希望能够根据需要中断站点,例如,在受保护的端点内工作时,避免站点的电子邮件恢复过程(请参阅is_protected_endpoint()):

该站点遇到技术困难。请查看您的站点管理电子邮件收件箱以了解说明。

如何禁用致命错误处理?

1 个回复
最合适的回答,由SO网友:birgire 整理而成

我们可以修改wp_is_fatal_error_handler_enabled() 功能有两种:

常数设置WP_DISABLE_FATAL_ERROR_HANDLER 常数至truewp-config.php 文件:

/**
 * Disable the fatal error handler.
 */
const WP_DISABLE_FATAL_ERROR_HANDLER = true; 

define( \'WP_DISABLE_FATAL_ERROR_HANDLER\', true );
过滤器的使用wp_fatal_error_handler_enabled 布尔过滤器:

/**
 * Disable the fatal error handler.
 */
add_filter( \'wp_fatal_error_handler_enabled\', \'__return_false\' );
Notes

参见票证#44458

这个wp_fatal_error_handler_enabled 过滤器将覆盖WP_DISABLE_FATAL_ERROR_HANDLER 常数

还要注意,如果常数禁用,而过滤器启用,则可能会出现布尔混淆。

在我的测试中,过滤器方法(作为一个必须使用的插件)没有按预期工作,因此我使用常量。希望我能进一步研究这个问题。

还可以添加自定义drop-in 文件fatal-error-handler.php 进入wp-content 目录(src), 要覆盖WP_Fatal_Error_Handler 根据需要分类。我们必须使用不同的类名,它必须定义handle() 方法作为registered shutdown function.

禁用它的一个简单示例是用一个不执行任何操作的自定义错误处理程序类重写默认错误处理程序类:

<?php
class WPSE_Fatal_Error_Handler {
    public function handle() {}
}
return new WPSE_Fatal_Error_Handler;
PHP 7+中的匿名类似乎也能正常工作:

<?php
return new Class(){
    public function handle() {}
};
它还可以扩展默认值WP_Fatal_Error_Handler 如果需要,请初始化。

然后是WP_SANDBOX_SCRAPING 常数看见#46045

设置WP_DEBUG 以真实的意愿not 禁用WSOD保护。这是故意的。看见#46825

相关推荐

为什么dbDelta()不能捕获MysqlErrors?

据我所见,dbDelta() 用于抑制在其操作过程中发生的数据库错误。一般来说,情况似乎是这样,但New Relic仍在报告函数中的MysqlErrors。准确的错误消息格式如下:MysqlError: Table \'xxx.wp_yyy_posts\' doesn\'t exist 发件人dbDelta() 在里面/wp-admin/includes/upgrade.php, 我们有:// Fetch the table column structure from the database&