【发布时间】:2021-08-03 10:46:44
【问题描述】:
我用一堆自定义类和自定义功能制作了一个 WordPress 主题(不过这更像是一个 PHP 问题)。过去,每当其中一个课程出现问题时,我都可以查看wp-content/debug.log 以查看问题所在。这已经可靠地工作了 6 个月。
但现在我遇到了一个错误,它在前端显示:
您的网站出现严重错误。请检查您的站点管理员电子邮件收件箱以获取说明。
但是如果我检查wp-content/debug.log,那么我看不到任何错误。
解决方案尝试 1:尝试“引发”错误
我尝试将其添加到我的 functions.php 文件的顶部:
if( !empty( $_GET['test'] ) ){
require('some/path/that/doesnt/exists.php' );
}
然后访问:https://example.org/?test=1234
这会导致“严重错误” - 并将输出写入wp-content/debug.log。错误是:
[2021 年 8 月 3 日 09:20:10 UTC] PHP 警告:require(some/path/that/doesnt/exists.php):无法打开流:在线...中没有这样的文件或目录...
但是...如果我将错误行 (require('some/path/that/doesnt/exists.php' );) 移动到我的一个自定义类中,我知道会抛出错误,我在 debug.log 中什么也得不到。嗯!
解决方案尝试 2:确保 debug.log 不会太大
有时我会看到奇怪的结果,如果 debug.log 很大(比如 50mb+)。所以我尝试删除它并创建一个新的。结果一样。
解决方案尝试 3:确保正确设置调试设置
这就是我在 wp-config.php 中的内容:
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
@ini_set('display_errors',0);
因为它会在错误的require()-function 上抛出应有的警告,所以我认为它应该是这样的。
解决方案尝试 4:尝试指向不同的 debug.log 文件
我可以更改 WordPress 将写入的文件,但替换这一行:
define( 'WP_DEBUG_LOG', true );
用这一行:
define( 'WP_DEBUG_LOG', 'wp-content/new-debug.log' );
但这里也一样:仍然只出现一些错误。
解决方案尝试 5:确保 error_reporting 设置正确
我尝试按照那里的答案中建议的instructions on setting error_reporting 进行操作。
但我的 debug.log 文件中仍然没有出现错误。
如果我写这些行:
var_dump(E_ALL);
var_dump(E_STRICT);
var_dump(E_ALL | E_STRICT);
var_dump(E_ALL & E_STRICT);
然后输出:
int(32767) int(2048) int(32767) int(2048)
在设置 ini_sets 之后,在wp-config.php-文件中执行此操作时,以及如果我在“不写入 debug.log”-文件的类之一中执行此操作。不过,我不确定这意味着什么。
解决方案尝试 6:清除缓存
我尝试清除一堆缓存:服务器清漆缓存。使用 WordPress 插件的缓存设置。没有任何改变。
解决方案尝试 7:阅读 WordPress 故障排除文档
我阅读了WordPress Documentation on Troubleshooting,但在其中找不到任何内容。
解决方案尝试 8:复制到其他服务器并尝试复制错误(SUPER-WIERD!)
这就是它变得非常奇怪的时候!
我将站点复制到另一台服务器,起初同样的问题存在:我在前端收到错误,但没有写入 wp-content/debug.log。
然后我尝试对导致此“严重错误”的确切原因进行二进制搜索。所以我浏览了添加行的文件:
<?php
die('Do I make it this far?');
?>
然后通过代码将其向下移动。最后,我发现是这里的这一行:
if( array_key_exists( $some_id, $shortlisted_part_ids ) ){
...其中$shortlisted_part_ids 为空(不是数组)。
但是发现之后,我删除了我的“die()”语句,然后wp-content/debug.log-FILE 中出现了错误!?在不更改任何其他内容的情况下,除了通过代码使其“死”无数次。
请注意,这仅在开发服务器上。如果我将相同的die()-statement 添加到生产服务器,然后再次将其删除,那么 (sigh),仍然在前端收到严重错误,并且错误中仍然没有写入任何内容-日志。
未尝试的解决方案
-
列出最近更改的文件:我认为可能是要写入调试文件的插件或一些代码更改。因此,如果我列出了最近更改的文件,在出现严重错误后,它可能会显示错误正在写入哪个文件。我四处搜索,试图找到这个终端命令 - 并玩弄了
grep,但我找不到正确的命令。 - 启动服务器:我没有尝试重启服务器,因为它是一个生产环境,有很多访问者。即使这样可以解决问题,我也讨厌依靠启动某些东西来使其工作。
- 停用插件 + 更改主题:我没有尝试过通常的做法:停用所有插件并更改为默认主题',因为 - 再次 - 这不是一种可行的故障排除技术,
其他评论
- Xdebug:我最近尝试在该服务器上设置 Xdebug。也许我在做的时候做了什么。我无法理解的是,有些错误会显示,有些则不会。
- 管理员电子邮件:有时我收到并发送错误电子邮件?!
【问题讨论】:
-
你查看过 php apache 日志 (/var/log/apache2/error_log) 吗?
-
感谢您的参与。为什么 apache-logs 应该有解决此问题的方法?我应该在其中寻找什么?
-
我的 apache 日志显示任何。 PHP 错误。在代码中出现致命错误。
-
您可以使用
find . -type f -newermt '2021-08-19'之类的内容检查最近修改的文件。测试的服务器是否安装了相同的 PHP 版本? -
@cezaryta 成功了!我找到了另一个文件,在那里我可以找到所有“消失”的错误。如果您将评论作为解决方案发表,那么我可以奖励您。出于某种原因,错误现在显示在
/wp-content/uploads/wc-logs/fatal-errors-DATETIMESTAMP-RANDOMSTRING.log中。我不知道为什么他们没有更早地打印在那里。我认为是一些竞争条件(因为我还没有更新 WooCommerce)。
标签: php wordpress woocommerce