Důležitost údržby databáze WordPress pro výkon a bezpečnost (actionscheduler _actions a _logs) (AKTUALIZOVÁNO 2.11.2023)

Jak byl napsán tento článek:
Obsah článku
Důležitost údržby databáze WordPress pro výkon a bezpečnost (actionscheduler _actions a _logs)

Při provozování webových stránek postavených na systému WordPress je důležité pravidelně udržovat a spravovat databázi. Dvě klíčové tabulky, které vyžadují pozornost, jsou actionscheduler_actionsactionscheduler_logs.

Údržba tabulky actionscheduler_actions

Tabulka actionscheduler_actions je zodpovědná za správu plánovaných úloh a akcí na vašich stránkách. Ukládá se zde informace o proběhlých, běžících a chybějících akcích. Defaultně (ve výchozím nastavení) by se záznamy se stavem „complete“ a „delete“ měly automaticky čistit po 30 dnech, ale občas tento proces může selhat. Je proto důležité pravidelně kontrolovat stav této tabulky a provádět ruční čištění, pokud je to nezbytné. Uchovávání těchto záznamů v tabulce může vést k růstu velikosti databáze a zpomalení výkonu. Pravidelné čištění této tabulky pomáhá udržovat rychlou odezvu webové stránky a zajišťuje efektivní správu plánovaných úloh.

Údržba tabulky actionscheduler_logs

Tabulka actionscheduler_logs uchovává záznamy o všech proběhlých úlohách a akcích. S rostoucím počtem záznamů může růst velikost této tabulky a tím i velikost celé databáze. Odstranění starých záznamů z této tabulky je důležité z hlediska udržování výkonnosti a bezpečnosti vašich stránek. Pravidelné mazání starých záznamů pomáhá minimalizovat riziko přetížení databáze a zvyšuje celkovou stabilitu vašeho webu.

Závěr

Pravidelná údržba a správa databáze WordPress jsou klíčové pro zajištění efektivního a bezproblémového provozu webových stránek. Pravidelné čištění tabulek actionscheduler_actionsactionscheduler_logs pomáhá udržovat výkon a minimalizuje riziko potenciálních bezpečnostních hrozeb spojených s růstem velikosti databáze.

Snippet pro automatické čístění

Snippet, který je přiložen níže, lze vložit na váš web dvěma způsoby. Prvním způsobem je přímo do souboru functions.php vaší šablony. Je však důležité, abyste předtím učinili zálohu webu a případně používali Child theme, aby v případě aktualizace hlavní šablony nedošlo k přemazaní snippetu ve functions.php.

Druhým způsobem je pomocí pluginu Code Snippets (nebo pomocí jiného vhodného pluginu na vkládání snippetů).

Kód automatický maže zaznamy v tabulce _logs starší 1 dne a _actions jednou za 7 dní. navíc, v administraci na nástěnce zobrazí widget se stavem těchto tabulek. Viz obrázek.

Seznam změn 3.11.2023:

  1. Přidána funkčnost:
    • Přidáno tlačítko pro manuální spuštění údržby databáze.
    • Implementována automatická funkce pro úklid databáze, která se spouští při načtení widgetu.
    • Při načtení widgetu implementována optimalizace tabulek pro lepší výkon.
  2. Vylepšení:
    • Zlepšena čitelnost kódu přidáním podrobnějších komentářů.
    • Zlepšena efektivita údržby databáze optimalizací dotazů pro mazání starých záznamů.
    • Přidáno informativní sdělení o frekvenci automatické údržby.
  3. Zpracování chyb:
    • Vylepšeno zpracování chyb při údržbě databáze.
    • Implementovány chybové zprávy pro případy, kdy údržba databáze narazí na problémy.
  4. Restrukturalizace kódu:
    • Přepracován kód pro zlepšení jeho organizace a čitelnosti.
  5. Optimalizace:
    • Zahrnuta optimalizace tabulek ‚actionscheduler_actions‘ a ‚actionscheduler_logs‘ při načtení widgetu.
  6. Dokumentace:
    • Přidány vložené komentáře k vysvětlení účelu a funkcionality různých částí kódu.
  7. Zlepšení použitelnosti:
    • Poskytnuty další informace ohledně automatického procesu úklidu v widgetu.
  8. Opravy chyb:
    • Vyřešeny problémy související s procesem čištění tabulky ‚actionscheduler_logs‘.
  9. Vylepšení výkonu:
    • Optimalizovány dotazy pro získání velikosti tabulky a počtu záznamů pro lepší výkon.
  10. Správa údržby:
    • Přidány funkce pro plánování a zrušení plánovaných úloh automatické údržby.
  11. Vylepšení uživatelského rozhraní:
    • Přidáno formátování pro informační a chybové zprávy pro zlepšení uživatelské zkušenosti.
  12. Rozšíření funkcí:
    • Rozšířeny schopnosti widgetu o informace o plánovaných úlohách údržby.

/* VERZE 03.11.2023 */


function get_table_size($table_name) {
    global $wpdb;
    $result = $wpdb->get_row("SHOW TABLE STATUS LIKE '$table_name'");
    return round($result->Data_length / 1024 / 1024, 2); // získání velikosti tabulky v MB
}

function custom_report_widget_function() {
    global $wpdb;
    $actions_types = array('complete', 'delete', 'canceled', 'failed', 'pending'); // typy akcí

    $actionscheduler_actions_size_before = get_table_size($wpdb->prefix . 'actionscheduler_actions'); // získání velikosti tabulky 'actionscheduler_actions'
    $logs_size_before = get_table_size($wpdb->prefix . 'actionscheduler_logs'); // získání velikosti tabulky 'actionscheduler_logs'

    $logs_count_before = $wpdb->get_var("
        SELECT COUNT(*) as total_count
        FROM {$wpdb->prefix}actionscheduler_logs
    "); // získání celkového počtu záznamů v tabulce 'actionscheduler_logs'

    $logs_table_size_MB = $wpdb->get_var("
        SELECT ROUND((data_length + index_length) / 1024 / 1024, 2) as table_size_MB
        FROM information_schema.TABLES
        WHERE table_schema = '{$wpdb->dbname}'
        AND table_name = '{$wpdb->prefix}actionscheduler_logs'
    "); // získání velikosti tabulky 'actionscheduler_logs' v MB

    // Výpis informací o tabulkách a počtu záznamů
    echo "<p>Aktuální počet záznamů v tabulce <b>actionscheduler_logs</b>: ${logs_count_before}</p>";
    echo "<p>Velikost tabulky <b>actionscheduler_logs</b>: ${logs_table_size_MB} MB</p>";
    echo "<p>Celková velikost tabulky <b>actionscheduler_actions</b>: ${actionscheduler_actions_size_before} MB</p>";

    // Výpis počtu záznamů pro každý typ akce
    foreach ($actions_types as $action_type) {
        $action_count_before = $wpdb->get_var($wpdb->prepare("
            SELECT COUNT(*)
            FROM {$wpdb->prefix}actionscheduler_actions
            WHERE status = %s
        ", $action_type));
        echo "<p>Počet záznamů se stavem '${action_type}': ${action_count_before}</p>";
    }

    // Zpracování údržby na základě stisknutí tlačítka
    if (isset($_POST['autoclean_button'])) {
        $logs_cleanup_result = autoclean_action_scheduler();
        if ($logs_cleanup_result !== false) {
            echo "<p style='color:green'>Údržba tabulky actionscheduler_logs byla provedena úspěšně.</p>";
            echo "<p style='color:green'>Údržba tabulky actionscheduler_actions byla provedena úspěšně.</p>";
        } else {
            echo "<p style='color:red'>Při údržbě tabulky actionscheduler_logs došlo k chybě.</p>";
            echo "<p style='color:red'>Při údržbě tabulky actionscheduler_actions došlo k chybě.</p>";
        }
    }

    // Tlačítko pro spuštění údržby
    echo '<form method="post">';
    echo '<input type="submit" name="autoclean_button" value="Spustit údržbu databáze" class="button button-large button-primary">';
	
	echo '<pre>Údržba probíhá automatický pokaždé, když se načte tento widget.<br />V _logs je odstraněno vše starší 1 dne a v _actions stavy:<br />complete, delete, failed starší 7 dní. Nebo použijte tlačítko.</pre>';
    echo '</form>';

    // Automatická údržba při načítání widgetu
    autoclean_action_scheduler();
}

function autoclean_action_scheduler() {
    global $wpdb;

    // Údržba tabulek 'actionscheduler_logs' a 'actionscheduler_actions'
    $actionscheduler_actions_size_before = get_table_size($wpdb->prefix . 'actionscheduler_actions');
    $logs_deleted = $wpdb->query("
        DELETE FROM {$wpdb->prefix}actionscheduler_logs
        WHERE log_date_gmt < DATE_SUB(NOW(), INTERVAL 1 DAY)
    ");

    $actions_deleted = $wpdb->query("
        DELETE FROM {$wpdb->prefix}actionscheduler_actions
        WHERE status IN ('complete', 'delete', 'failed')
        AND (last_attempt_gmt < DATE_SUB(NOW(), INTERVAL 7 DAY) OR last_attempt_gmt IS NULL)
    ");

    // Vrácení informace o úspěchu či chybě při údržbě
    if ($logs_deleted !== false || $actions_deleted !== false) {
        return true;
    } else {
        return false;
    }
}

function optimize_actionscheduler_tables() {
    global $wpdb;
    $wpdb->query("OPTIMIZE TABLE {$wpdb->prefix}actionscheduler_actions");
    $wpdb->query("OPTIMIZE TABLE {$wpdb->prefix}actionscheduler_logs");
}


// Funkce pro plánování automatické údržby
function schedule_autoclean_action() {
    if (!wp_next_scheduled('autoclean_action_event')) {
        wp_schedule_event(time(), 'daily', 'autoclean_action_event');
    }
}

// Funkce pro zrušení plánování automatické údržby
function unschedule_autoclean_action() {
    $timestamp = wp_next_scheduled('autoclean_action_event');
    wp_unschedule_event($timestamp, 'autoclean_action_event');
}

// Funkce pro zpracování plánované události
function handle_autoclean_action_event() {
    autoclean_action_scheduler();
}

// Háčky pro správu plánování a zpracování automatické údržby
add_action('wp_dashboard_setup', function () {
    wp_add_dashboard_widget('custom_report_widget', 'Stav actionscheduler _actions a _logs', 'custom_report_widget_function');
    optimize_actionscheduler_tables(); // Optimalizace tabulek při načtení widgetu
    schedule_autoclean_action(); // Plánování automatické údržby
});

// Háček pro zpracování plánované události
add_action('autoclean_action_event', 'handle_autoclean_action_event');

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *