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:
- Ki kell olvasnia.
- Ki kell csomagolnia (unserialize).
- 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 WordPress „agya” a wp_options (vagy esetünkben wput_options) tábla. Ez tárol mindent: az oldal címétől kezdve a pluginok beállításáig.
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:

Ha ZÖLD csíkot látsz felül: Nyugodj meg, a fejlesztőd jó munkát végzett.
Ha PIROS csíkot látsz (és az összeg 1-2 MB felett van): Akkor ideje leülni beszélgetni a fejlesztőddel, vagy nekiállni takarítani, ahogy mi tettük.
Fontos!
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.




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