WordPressin admin-ajax.php on ollut vuosia suosituin tapa toteuttaa AJAX-toiminnallisuuksia. Vaikka ratkaisu on yksinkertainen käyttää, siitä tulee usein merkittävä suorituskyvyn pullonkaula etenkin suurissa sivustoissa, WooCommerce-kaupoissa ja paljon JavaScriptiä käyttävissä ympäristöissä.
Monet hitaat WordPress-sivustot kärsivät ongelmista, jotka eivät johdu tietokannasta tai palvelimesta, vaan liiallisesta tai tehottomasta admin-ajax.php-käytöstä.
Mikä admin-ajax.php on?
WordPress tarjoaa keskitetyn endpointin AJAX-kutsuille:
/wp-admin/admin-ajax.php
Frontend tai admin lähettää pyynnön:
jQuery.post(
ajaxurl,
{
action: 'my_action'
}
);
Backend käsittelee sen:
add_action(
'wp_ajax_my_action',
'my_handler'
);
Miksi admin-ajax.php hidastuu?
Jokainen AJAX-pyyntö käynnistää lähes koko WordPressin.
Prosessi:
Request
↓
WordPress Bootstrap
↓
Plugins
↓
Themes
↓
Hooks
↓
AJAX Callback
Vaikka callback palauttaisi vain pienen JSON-vastauksen, koko ympäristö ladataan.
Bootstrap-kustannus
Tyypillinen AJAX-pyyntö sisältää:
- WordPress coren latauksen
- aktiiviset lisäosat
- teeman
- hookit
- käyttäjän autentikoinnin
Tämän vuoksi yksittäinen AJAX-kutsu voi kuluttaa enemmän resursseja kuin odotetaan.
Useat samanaikaiset AJAX-kutsut
Yleinen ongelma:
Page Load
↓
10 AJAX Requests
↓
10 WordPress Bootstrappia
Tämä kasvattaa:
- CPU-kuormaa
- muistinkäyttöä
- PHP-workerien käyttöä
Heartbeat API
Yksi tunnetuimmista admin-ajax-kuorman lähteistä.
Heartbeat käyttää:
admin-ajax.php
taustakommunikaatioon.
Oletuksena:
- autosave
- käyttäjälukot
- editorisynkronointi
voivat lähettää jatkuvia pyyntöjä.
WooCommerce ja AJAX-kuorma
WooCommerce käyttää runsaasti AJAXia:
- cart fragments
- checkout päivitykset
- tuotehaku
- variaatioiden lataus
Esimerkiksi:
wc-ajax=get_refreshed_fragments
on usein merkittävä kuormituksen aiheuttaja.
Cart Fragments -ongelma
Vanhemmissa WooCommerce-versioissa:
Jokainen sivu
↓
AJAX Request
↓
Cart Refresh
Vaikka ostoskori olisi tyhjä.
Tämä voi lisätä tuhansia ylimääräisiä pyyntöjä päivässä.
Admin-puolen ongelmat
Suuret sivustot kärsivät usein:
- hitaista listauksista
- jatkuvista autosave-pyynnöistä
- pluginien omista pollausmekanismeista
Monet lisäosat lähettävät AJAX-pyyntöjä muutaman sekunnin välein.
Query Monitor analysointiin
Query Monitor näyttää:
- AJAX-kutsujen keston
- SQL-kyselyt
- muistinkäytön
- hook-suoritukset
Tämä auttaa tunnistamaan hitaat callbackit.
Network-tab selaimessa
Chrome DevTools:
Network
↓
XHR / Fetch
paljastaa:
- hitaat AJAX-pyynnöt
- toistuvat kutsut
- suuret payloadit
Hitaat tietokantakyselyt
Moni AJAX-callback sisältää:
new WP_Query(...)
joka suoritetaan jokaisella pyynnöllä.
Ongelma korostuu, jos:
- query on raskas
- cache puuttuu
- käyttäjiä on paljon
Välimuistin puuttuminen
Huono:
function get_data() {
return expensive_query();
}
Parempi:
$data = wp_cache_get('my_data');
if (!$data) {
$data = expensive_query();
wp_cache_set(
'my_data',
$data
);
}
Payloadien koko
AJAX-vastaukset voivat kasvaa turhaan.
Huono:
{
"posts": [...]
}
jossa palautetaan satoja objekteja.
Parempi:
- pagination
- lazy loading
- vain tarvittavat kentät
REST API vaihtoehtona
Monissa tapauksissa:
admin-ajax.php
voidaan korvata:
/wp-json/
REST API tarjoaa:
- paremman arkkitehtuurin
- helpomman cachettamisen
- modernit HTTP-metodit
Miksi REST API on usein nopeampi
REST endpointit voidaan rakentaa kevyemmiksi.
Lisäksi:
- CDN-cache mahdollista
- GET-vastaukset cachettavissa
- parempi versionhallinta
Polling vs event-driven
Huono:
AJAX every 5 seconds
Parempi:
Webhook
Event
Push update
Näin vältetään jatkuva kuormitus.
Rate limiting
Suojaa endpointit:
- bottiliikenteeltä
- väärinkäytöltä
- virheellisiltä skripteiltä
Esimerkiksi:
100 requests/minute
per IP.
Redis ja AJAX
Redis auttaa erityisesti:
- options-dataan
- query cacheen
- transientteihin
Tämä vähentää AJAX-kutsujen tietokantakuormaa.
PHP-worker pullonkaula
Tyypillinen ongelma:
50 AJAX Requests
↓
10 PHP Workers
↓
40 Requests Waiting
Tällöin vasteajat kasvavat nopeasti.
Milloin admin-ajax kannattaa korvata?
Harkitse REST APIa jos:
- endpoint on julkinen
- data on cachettavaa
- liikenne on suurta
- kyseessä on moderni frontend
Yleisimmät virheet
- AJAX kaikkeen
- jatkuva polling
- ei välimuistia
- raskaat WP_Queryt
- suuret JSON-vastaukset
- WooCommerce cart fragments ilman optimointia
- Heartbeat API:n unohtaminen
Paras käytännön arkkitehtuuri
Frontend
↓
REST API
↓
Redis Cache
↓
WordPress
↓
Database
AJAXia käytetään vain silloin, kun sille on todellinen tarve.
Yhteenveto
admin-ajax.php on edelleen käyttökelpoinen työkalu, mutta siitä tulee helposti suorituskyvyn pullonkaula suurissa WordPress-ympäristöissä. Jokainen AJAX-pyyntö lataa lähes koko WordPressin, mikä tekee runsaasta käytöstä kallista palvelinresurssien näkökulmasta.
Kun hitaat callbackit optimoidaan, välimuisti otetaan käyttöön ja REST API korvaa tarpeettomat AJAX-kutsut, voidaan vähentää merkittävästi palvelinkuormaa ja parantaa käyttäjäkokemusta.