JavaScript is disabled in your browser. Please enable it for the full experience.
Autoload

Autoload: A rejtett beállítás, ami megöli a sebességet

A tárhelyszolgáltatók kedvenc automatikus válasza, amikor az oldalad 1 perces leállásokat produkál: „Elfogyott a memória. Fizessen elő a…

⏳ 12 perc

Lőrincz András

A tárhelyszolgáltatók kedvenc automatikus válasza, amikor az oldalad 1 perces leállásokat produkál: „Elfogyott a memória. Fizessen elő a nagyobb csomagra!”

Persze. Ez a legkönnyebb válasz. Ha lyukas a vödör, vegyél nagyobbat, abba több víz fér, lassabban folyik el. De mi lenne, ha inkább megkeresnénk a lyukat? Vagy jelen esetben: mi lenne, ha nem etetnénk a szervert digitális szeméttel minden egyes oldalletöltésnél?

A közelmúltban egy projekt auditálása során (nevezzük digitális boncolásnak) találtam rá a WordPress egyik legalattomosabb gyilkosára. Nem, nem egy vírus volt. Hanem a fejlesztői lustaság és a WordPress „kényelmi” funkcióinak szerelemgyereke: az Autoload.

A tetőfedő és az indokolatlan tégla

Hogy a kevésbé technikai beállítottságúak is értsék, miért omlik össze egy erőműnek beillő szerver egyetlen rossz adatbázis-bejegyzéstől, használjunk egy analógiát.

Képzeljünk el egy tetőfedő mestert (ez a szerver). Reggel felmegy a tetőre dolgozni. Mi van a derekán? Az övtáskája.

  • Ideális esetben: Ebben tartja a kalapácsot, a szöget, a ceruzát. Azokat a dolgokat, amikhez minden percben nyúlnia kell. Ez az Autoload.
  • A furgonban hagyva: Lent, a földön van az ütvefúró, a tartalék cserép, a körfűrész. Miért? Mert ezek csak ritkán kellenek. Ha a tetőfedő a hátán cipelné egész nap a 25 kilós betonkeverőt is, csak azért, mert „hátha kell majd délután 4-kor”, délre gerincsérvet kapna és leesne a tetőről. Már ha fel tudna mászni. 🙂

A WordPress adatbázisa pontosan így működik. Vagyis így kellene működnie.

A boncolás eredménye: 1.3 Megabájt a hátizsákban

A vizsgált webshop esetében a „tetőfedőnk” nem csak a kalapácsot vitte magával. Valaki – egy korábbi fejlesztő vagy egy rosszul megírt plugin – belepakolt a szerencsétlen szerver övtáskájába 10.000+ darab meta adatot / kulcsot és egy rég törölt biztonsági plugin teljes konfigurációs naplóját, több ezer sorral.

Ez adatbázis nyelven 1.3 Megabájt textuális adatot jelentett

„Na bumm, egy iPhone fotó is nagyobb ennél” – mondhatná a laikus. Csakhogy az adatbázis nem fotóalbum. Ezt az 1.3 MB adatot a szervernek minden egyes oldalletöltésnél:

  1. Ki kell olvasnia.
  2. Ki kell csomagolnia (unserialize).
  3. Be kell töltenie a memóriába (RAM).

Ha egyszerre 20 vásárló van az oldalon, akkor ez a folyamat 20-szor fut le párhuzamosan. Ez a hirtelen memóriatüske az, ami miatt a Linux kernel „OOM Killer” (Out of Memory Killer) folyamata tarkón lövi a webshopodat.

A technikai háttér (Avagy hol rontják el a fejlesztők)

A tábla struktúrája pofonegyszerű, mindössze 4 oszlop, mégis itt vérzik el a legtöbb oldal:

Az utolsó oszlop a lényeg: autoload.

  • YES: „Övtáska”. Minden oldalletöltésnél betöltődik.
  • NO: „Furgon”. Csak akkor töltődik be, ha a kód kifejezetten kéri.

A fejlesztői lustaság ára

Miért kerülnek nagy adatok az autoloadba? Mert a WordPress alapértelmezése veszélyes. Amikor egy fejlesztő elment egy adatot, általában ezt a függvényt használja:

update_option('kulcs', 'adat');

A WordPress ilyenkor – a fejlesztő helyett gondolkodva – azt mondja: „Ez biztos fontos, beteszem az Autoloadba (YES)!”.

Egy lelkiismeretes fejlesztő (vagy aki már égetett meg szervert) viszont tudja, hogy a nagy adatokat nem cipeljük feleslegesen. Ő így írja meg:

update_option('kulcs', 'adat', 'no'); // A harmadik paraméter a lényeg!

Ez a kis 'no' a különbség a villámgyors webshop és a haldokló szerver között.

A tanulság

A takarítás után (a szemetet töröltük, a szükséges, de ritkán használt adatokat átállítottuk autoload='no'-ra) az oldal memóriaterhelése több mint 80%-kal csökkent. A szerver fellélegzett, a leállások megszűntek.

Nem minden teljesítmény-probléma oldható meg pénzzel és erősebb vassal. Néha csak ki kell venni a téglákat a tetőfedő zsebéből.

Ha lassú az oldalad, ne csak a cache plugint nyomkodd. Nézz bele a wp_options táblába. Lehet, hogy meglepődsz, mit cipelsz a hátadon évek óta.


A diagnózis: Íme a célszerszám (Ingyen)

Oké, elolvastad a fentieket, és most valószínűleg remegő kézzel nyúlsz a billentyűzethez: „Vajon az én szerverem övtáskája is tele van téglával?”

Hogy ne kelljen a phpMyAdmin-ban SQL parancsokkal bűvészkedned (ami, valljuk be, orosz rulett, ha nem vagy adatbázis-szakértő), írtam egy faék egyszerűségű diagnosztikai eszközt.

Ez nem egy csilli-villi „Speed Optimizer” plugin, ami még több szemetet hagy maga után. Ez egy 50 soros kód, ami egyetlen dolgot tud: könyörtelenül az arcodba tolja az igazságot.

Így használd (5 perc az egész)

Mivel ilyet nem találsz a WordPress tárolóban (túl egyszerű lenne), ezt neked kell feltenned. Ne aggódj, gyerekjáték.

1. lépés: A kód Másold ki az alábbi kódot egy jegyzettömbbe, és mentsd el a gépeden pontosan ezen a néven: andras-autoload-checker.php

<?php
/**
 * Plugin Name: Autoload Checker (Diagnosztika)
 * Description: Kilistázza a legnagyobb 'autoload' adatokat az options táblából, hogy lásd, mi lassítja az oldalt.
 * Version: 1.0
 * Author: András
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

// Menüpont hozzáadása az Eszközök (Tools) alá
add_action('admin_menu', 'ac_add_tools_page');

function ac_add_tools_page() {
    add_management_page(
        'Autoload Méret Ellenőrző', // Oldal címe
        'Autoload Checker',         // Menü címe
        'manage_options',           // Szükséges jogosultság (Csak admin)
        'autoload-checker',         // Slug
        'ac_render_page'            // Megjelenítő függvény
    );
}

// Segédfüggvény a méret formázásához (Byte -> KB -> MB)
function ac_format_size($bytes) {
    if ($bytes >= 1048576) {
        return number_format($bytes / 1048576, 2) . ' MB';
    } elseif ($bytes >= 1024) {
        return number_format($bytes / 1024, 2) . ' KB';
    } elseif ($bytes > 1) {
        return $bytes . ' bytes';
    } elseif ($bytes == 1) {
        return $bytes . ' byte';
    } else {
        return '0 bytes';
    }
}

// Az oldal megjelenítése
function ac_render_page() {
    global $wpdb;

    // BIZTONSÁG: Közvetlen SQL lekérdezés, de nem használunk user inputot,
    // így az SQL Injection ellen védett. Csak olvasunk.
    $results = $wpdb->get_results("
        SELECT option_name, option_value, LENGTH(option_value) as size 
        FROM {$wpdb->prefix}options 
        WHERE autoload = 'yes' 
        ORDER BY size DESC 
        LIMIT 50
    ");

    $total_autoload = $wpdb->get_var("
        SELECT SUM(LENGTH(option_value)) 
        FROM {$wpdb->prefix}options 
        WHERE autoload = 'yes'
    ");

    echo '<div class="wrap">';
    echo '<h1>Autoload Checker - Diagnosztika</h1>';
    
    // Figyelmeztető színek beállítása
    $alert_color = ($total_autoload > 800000) ? '#d63638' : '#00a32a'; 
    $total_formatted = ac_format_size($total_autoload);

    // XSS VÉDELEM: Statikus HTML kimenet
    echo "<div style='background: #fff; padding: 20px; border-left: 5px solid $alert_color; box-shadow: 0 1px 1px rgba(0,0,0,0.1); margin-bottom: 20px;'>";
    echo "<h2 style='margin-top:0;'>Összes 'Autoload' adat mérete: <span style='color:$alert_color'>$total_formatted</span></h2>";
    echo "<p>Ideális esetben ez <strong>800 KB - 1 MB</strong> alatt van. Ha ennél több, az lassítja az oldalbetöltést (TTFB) és memóriát fogyaszt.</p>";
    echo "</div>";

    echo '<table class="widefat fixed striped">';
    echo '<thead><tr>';
    echo '<th style="width: 250px;">Option Name (Név)</th>';
    echo '<th style="width: 100px;">Méret</th>';
    echo '<th>Adat eleje (Minta)</th>';
    echo '</tr></thead>';
    echo '<tbody>';

    if ($results) {
        foreach ($results as $row) {
            // XSS VÉDELEM: Az adatbázisból jövő tartalmat escapeljük (esc_html)
            $preview = esc_html(substr($row->option_value, 0, 150));
            if (strlen($row->option_value) > 150) $preview .= '...';
            
            // XSS VÉDELEM: A nevet is escapeljük
            $safe_name = esc_html($row->option_name);

            $row_style = '';
            if ($row->size > 500000) { 
                 $row_style = 'style="color:red; font-weight:bold;"';
            }

            echo '<tr>';
            echo "<td $row_style>{$safe_name}</td>";
            echo "<td $row_style>" . ac_format_size($row->size) . "</td>";
            echo "<td style='font-family: monospace; color: #666;'>$preview</td>";
            echo '</tr>';
        }
    } else {
        echo '<tr><td colspan="3">Nem található autoload adat.</td></tr>';
    }

    echo '</tbody></table>';
    echo '</div>';
}

2. lépés: Telepítés Két opciód van, válaszd amelyik szimpatikusabb:

  • Az egyszerű módszer: A lementett php fájlt csomagold be egy ZIP fájlba (jobb klikk -> Tömörítés). Ezután a WordPress adminban menj a Bővítmények -> Új hozzáadása -> Bővítmény feltöltése menübe, és töltsd fel a zipet.
  • A profi módszer: Ha van FTP hozzáférésed, másold be a fájlt a /wp-content/plugins/ mappába.

3. lépés: Az ítélet napja – Kapcsold be a bővítményt.

Ezután az admin menüben keresd az Eszközök (Tools) -> Autoload Checker menüpontot.
Valami ilyesmit fogsz látni:

Ez a plugin csak olvas. Nem töröl semmit, nem javít meg semmit magától, csak megmutatja, hol a baj. Ha végeztél a diagnosztikával, kapcsold ki és töröld le.

Lőrincz András avatar

Lőrincz András

Lőrincz András vagyok, így hívnak. WordPress fejlesztőként weboldalak készítésével foglalkozom.

Amikor épp nem weboldalakat rakok össze, kvantumfizikáról vagy sci-firől olvasok, nézek videókat. Néha pedig elmerengek azon, hogy vajon mit csinál a másik énem egy párhuzamos univerzumban. Talán ő is épít valamit – vagy épp megőrült.

Vélemény, hozzászólás?

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük