详情
评论
问答

排查数据库造成的网站报错502问题插件

温馨提示:本文最后更新于2025-11-30 22:06:21, 某些文章具有时效性,若有错误或已失效,请在下方 留言或联系 轩玮博客

将以下代码保存为 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 自带了一个隐藏的修复工具,不需要登录后台就能用。

  1. 通过 FTP 下载根目录下的 wp-config.php 文件。

  2. 在 /* That's all, stop editing! Happy publishing. */ 这行字上面,添加一行代码:

  3. define('WP_ALLOW_REPAIR', true);
    1. 上传覆盖回去。

    2. 在浏览器直接访问这个地址: http://你的域名.com/wp-admin/maint/repair.php

    3. 你会看到一个白色页面,点击按钮 “修复数据库” 或 “修复并优化数据库”

      • 这个脚本直接调用数据库底层命令,比插件更稳定。

    4. 重要: 修复完成后,务必把 wp-config.php 里加的那行代码删除!否则任何人都能来重置你的数据库。

本站代码模板仅供学习交流使用请勿商业运营,严禁从事违法,侵权等任何非法活动,否则后果自负!
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容