将以下代码保存为 shiguang-health-check.php,放入 wp-content/plugins/shiguang-health-check/ 文件夹中,然后启用。
<?php
/*
Plugin Name: Shiguang System & DB Health Check
Description: 专门诊断 502 错误来源,检查 wp_options autoload 大小、PHP 限制及数据库表状态。
Version: 1.0
Author: ShiGuang
*/
if ( ! defined( 'ABSPATH' ) ) exit;
// 添加后台菜单
add_action('admin_menu', function() {
add_management_page(
'502 诊断工具',
'502 诊断工具',
'manage_options',
'shiguang-health-check',
'shiguang_health_check_page'
);
});
function shiguang_health_check_page() {
global $wpdb;
// 1. 检查 Autoload 数据大小 (这是最常见的 502 原因)
$autoload_query = "SELECT SUM(LENGTH(option_value)) as total_size FROM $wpdb->options WHERE autoload = 'yes'";
$autoload_size = $wpdb->get_var($autoload_query);
$autoload_size_mb = round($autoload_size / 1024 / 1024, 2);
// 获取前 20 个最大的 Autoload 选项
$top_options = $wpdb->get_results("SELECT option_name, LENGTH(option_value) as size FROM $wpdb->options WHERE autoload = 'yes' ORDER BY size DESC LIMIT 20");
// 2. 检查 PHP 环境
$memory_limit = ini_get('memory_limit');
$max_execution_time = ini_get('max_execution_time');
// 3. 检查数据库表是否有崩溃/开销
$tables = $wpdb->get_results("SHOW TABLE STATUS");
echo '<div class="wrap">';
echo '<h1>Shiguang 502 诊断报告</h1>';
// --- 模块 1: Autoload 分析 ---
echo '<h2>1. 数据库 Autoload 分析 (重点嫌疑)</h2>';
echo '<div class="card" style="max-width: 100%; padding: 15px; margin-bottom: 20px;">';
echo '<p><strong>当前 Autoload 总大小:</strong> ' . $autoload_size_mb . ' MB</p>';
if ($autoload_size_mb > 1) {
echo '<p style="color: red;">⚠️ 警告: Autoload 数据超过 1MB,这极有可能是导致 502 的原因。建议清理下方列表中的大文件。</p>';
} else {
echo '<p style="color: green;">✅ 状态良好: Autoload 数据在正常范围内。</p>';
}
echo '<table class="widefat striped">';
echo '<thead><tr><th>Option Name (字段名)</th><th>Size (大小)</th><th>建议操作</th></tr></thead><tbody>';
foreach ($top_options as $opt) {
$size_kb = round($opt->size / 1024, 2);
$alert = ($size_kb > 100) ? 'style="color:red; font-weight:bold;"' : '';
echo "<tr>";
echo "<td>{$opt->option_name}</td>";
echo "<td $alert>{$size_kb} KB</td>";
echo "<td><a href='" . admin_url('options.php') . "' target='_blank'>去查看/删除</a></td>";
echo "</tr>";
}
echo '</tbody></table>';
echo '</div>';
// --- 模块 2: PHP 环境限制 ---
echo '<h2>2. PHP 环境限制</h2>';
echo '<div class="card" style="max-width: 100%; padding: 15px; margin-bottom: 20px;">';
echo '<ul>';
echo "<li><strong>Memory Limit (内存限制):</strong> $memory_limit (推荐至少 256M)</li>";
echo "<li><strong>Max Execution Time (超时时间):</strong> $max_execution_time (推荐至少 60s)</li>";
echo '</ul>';
echo '</div>';
// --- 模块 3: 数据库表健康度 ---
echo '<h2>3. 数据库表状态 (Data Overhead)</h2>';
echo '<div class="card" style="max-width: 100%; padding: 15px;">';
echo '<p>如果有表的 "Data Free" 很大,说明有碎片;如果 Engine 报错,说明表损坏。</p>';
echo '<table class="widefat striped">';
echo '<thead><tr><th>表名</th><th>行数</th><th>数据大小</th><th>碎片 (Data Free)</th><th>状态</th></tr></thead><tbody>';
foreach ($tables as $table) {
if ($table->Data_free > 0 || !empty($table->Comment)) {
$data_free_kb = round($table->Data_free / 1024, 2);
$data_size_kb = round($table->Data_length / 1024, 2);
echo "<tr>";
echo "<td>{$table->Name}</td>";
echo "<td>{$table->Rows}</td>";
echo "<td>{$data_size_kb} KB</td>";
echo "<td style='color:orange'>{$data_free_kb} KB</td>";
echo "<td>{$table->Comment}</td>"; // 显示错误信息
echo "</tr>";
}
}
echo '</tbody></table>';
echo '<p><em>注:仅显示有碎片或有问题的表。如果此处为空,说明表结构基本健康。</em></p>';
echo '</div>';
echo '</div>';
}
在wp后台的工具-502诊断工具就可以看见插件的面板,里面有一些数据库的信息可以协助排查问题
—-手动分割线—-
其实WordPress 自带了一个隐藏的修复工具,不需要登录后台就能用。
-
通过 FTP 下载根目录下的
wp-config.php文件。 -
在
/* That's all, stop editing! Happy publishing. */这行字上面,添加一行代码: -
define('WP_ALLOW_REPAIR', true);-
上传覆盖回去。
-
在浏览器直接访问这个地址:
http://你的域名.com/wp-admin/maint/repair.php -
你会看到一个白色页面,点击按钮 “修复数据库” 或 “修复并优化数据库”。
-
这个脚本直接调用数据库底层命令,比插件更稳定。
-
-
重要: 修复完成后,务必把
wp-config.php里加的那行代码删除!否则任何人都能来重置你的数据库。
-













暂无评论内容