@harrasteblogi JUURI NYT
--:--

Tilaa uutiskirje

Saat tuoreimmat 10 uusinta artikkelia kerran viikossa sähköpostiisi.

Tilaa uutiskirje

WordPress AJAX (admin-ajax.php) pullonkaulojen analyysiWordPressin 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.

🍪