@harrasteblogi JUURI NYT
--:--

Tilaa uutiskirje

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

Tilaa uutiskirje

WordPressin background processing ilman raskaita lisäosiaMonet WordPress-sivustojen suorituskykyongelmat johtuvat siitä, että raskaita tehtäviä suoritetaan käyttäjän requestin aikana. Kun sama request yrittää renderöidä sivun, tehdä API-kutsuja, käsitellä dataa ja lähettää sähköposteja yhtä aikaa, vasteajat kasvavat nopeasti.

Tiivistelmä
Kevyt queue-ajattelu WordPressissä

WordPressissä ei tarvita aina RabbitMQ:ta tai monimutkaista worker-järjestelmää....

Jobin lisääminen queueen

global $wpdb; $wpdb->insert( $wpdb->prefix . 'background_jobs', [ 'job_type' => 'send_email', 'payload' => wp_json_encode([ 'email' => $email ]), 'status' => 'pending', 'created_at' => current_time('mysql') ] );...

Worker-prosessi

Worker hakee pending-jobit:...

Job processing

foreach ($jobs as $job) { $payload = json_decode($job->payload, true); wp_mail( $payload['email'], 'Hello', 'Message' ); $wpdb->update( $table, ['status' => 'done'], ['id' => $job->id] ); } WP-Cron...

WP-Cron taustaprosessoinnissa

Kevyin vaihtoehto....

WP-Cronin rajoitukset

WP-Cron ei ole oikea cron....

Async request ilman odotusta

Voit tehdä “fire and forget” -requestin:...

AJAX worker endpoint

add_action('wp_ajax_my_async', function() { // heavy processing wp_die(); }); Batch processing Älä käsittele tuhansia rivejä kerralla....

Batch processing

Älä käsittele tuhansia rivejä kerralla....

Retry logic

Jobit voivat epäonnistua....

Redis taustaprosessoinnissa

Redis toimii hyvin:...

Background processing WooCommercessa

Hyviä käyttökohteita:...

Action Scheduler ilman raskasta frameworkia

Voit toteuttaa saman idean itse:...

Monitorointi

Seuraa:...

Memory management

Pitkissä workereissa:...

Job priorisointi

Voit lisätä:...

Idempotentit jobit

Jobin pitää olla turvallinen ajaa uudelleen....

Yleisimmät virheet

Kevyt mutta skaalautuva malli:...

Paras arkkitehtuuri

Kevyt mutta skaalautuva malli:...

Yhteenveto

Background processing on yksi tärkeimmistä tavoista tehdä WordPressistä nopeampi ja skaalautuvampi ilman raskaita lisäosia tai monimutkaisia järjestelmiä. Kun raskaat operaatiot siirretään taustalle, käyttäjärequestit pysyvät kevyinä...

Background processing ratkaisee tämän siirtämällä raskaan työn taustalle.

Hyvin toteutettu taustaprosessointi mahdollistaa:

  • nopeammat sivulataukset
  • pienemmän TTFB:n
  • vakaamman admin-paneelin
  • skaalautuvamman arkkitehtuurin
  • paremman käyttäjäkokemuksen

Ja tämän voi tehdä ilman raskaita queue-plugineita.

Mitä background processing tarkoittaa WordPressissä

Taustaprosessointi tarkoittaa:

  • tehtävä lisätään jonoon
  • käyttäjän request päättyy nopeasti
  • varsinainen työ suoritetaan myöhemmin

Tyypillisiä käyttökohteita:

  • sähköpostit
  • API-syncit
  • kuvaprosessointi
  • raporttien generointi
  • WooCommerce-operaatiot
  • datamigraatiot
  • cache warming

Miksi raskas logiikka requestissa on ongelma

Huono malli:

save_post → API request → image processing → email send

Ongelmat:

  • timeoutit
  • korkea memory usage
  • hidas admin
  • käyttäjä odottaa turhaan

Kevyt queue-ajattelu WordPressissä

WordPressissä ei tarvita aina RabbitMQ:ta tai monimutkaista worker-järjestelmää.

Usein riittää:

  • custom DB queue
  • WP-Cron
  • async requests
  • Action Scheduler -tyylinen logiikka

Yksinkertainen queue-taulu

Esimerkki:

CREATE TABLE wp_background_jobs (
    id BIGINT UNSIGNED AUTO_INCREMENT,
    job_type VARCHAR(100),
    payload LONGTEXT,
    status VARCHAR(20),
    created_at DATETIME,
    PRIMARY KEY (id)
);

Tämä toimii queue-järjestelmänä.

Jobin lisääminen queueen

global $wpdb;

$wpdb->insert(
    $wpdb->prefix . 'background_jobs',
    [
        'job_type' => 'send_email',
        'payload' => wp_json_encode([
            'email' => $email
        ]),
        'status' => 'pending',
        'created_at' => current_time('mysql')
    ]
);

Worker-prosessi

Worker hakee pending-jobit:

$jobs = $wpdb->get_results("
    SELECT * FROM {$table}
    WHERE status = 'pending'
    LIMIT 10
");

Job processing

foreach ($jobs as $job) {

    $payload = json_decode($job->payload, true);

    wp_mail(
        $payload['email'],
        'Hello',
        'Message'
    );

    $wpdb->update(
        $table,
        ['status' => 'done'],
        ['id' => $job->id]
    );
}

WP-Cron taustaprosessoinnissa

Kevyin vaihtoehto.

if (!wp_next_scheduled('myplugin_process_queue')) {

    wp_schedule_event(
        time(),
        'minute',
        'myplugin_process_queue'
    );
}

Worker:

add_action(
    'myplugin_process_queue',
    'myplugin_run_jobs'
);

WP-Cronin rajoitukset

WP-Cron ei ole oikea cron.

Se käynnistyy vain:

  • sivulatausten yhteydessä

Siksi tuotannossa kannattaa käyttää:

*/1 * * * * wp cron event run --due-now

Async request ilman odotusta

Voit tehdä “fire and forget” -requestin:

wp_remote_post(
    admin_url('admin-ajax.php?action=my_async'),
    [
        'blocking' => false
    ]
);

Tämä vapauttaa käyttäjän requestin nopeasti.

AJAX worker endpoint

add_action('wp_ajax_my_async', function() {

    // heavy processing

    wp_die();
});

Batch processing

Älä käsittele tuhansia rivejä kerralla.

Huono:

foreach ($all_posts as $post)

Parempi:

LIMIT 50

Batch processing:

  • vähentää memory usagea
  • estää timeoutit
  • tekee prosessista vakaamman

Retry logic

Jobit voivat epäonnistua.

Lisää:

  • retry_count
  • failed status
  • exponential backoff

Esimerkki:

status = failed
retry_count = 3

Locking estää duplicate workerit

Ilman lockia:

  • useita workereita voi käsitellä saman jobin

Ratkaisu:

if (get_transient('queue_lock')) {
    return;
}

Redis taustaprosessoinnissa

Redis toimii hyvin:

  • queue-storeena
  • lock-managementissa
  • transient backendinä

Redis tekee processingista huomattavasti nopeamman.

Background processing WooCommercessa

Hyviä käyttökohteita:

  • order sync
  • email queue
  • analytics generation
  • stock updates

WooCommerce käyttää itsekin paljon async-ajattelua.

Action Scheduler ilman raskasta frameworkia

Voit toteuttaa saman idean itse:

  • jobs table
  • status system
  • retries
  • scheduled execution

Kevyempi kuin isot queue-kirjastot.

Monitorointi

Seuraa:

  • queue length
  • failed jobs
  • average processing time
  • worker runtime

Työkaluja:

  • Query Monitor
  • New Relic
  • custom admin dashboard

Memory management

Pitkissä workereissa:

wp_cache_flush();
gc_collect_cycles();

Tämä estää memory leakkejä.

Job priorisointi

Voit lisätä:

high
medium
low

Tärkeät jobit käsitellään ensin.

Idempotentit jobit

Jobin pitää olla turvallinen ajaa uudelleen.

Huono:

  • sama email lähtee 3 kertaa

Parempi:

  • duplicate protection
  • status checks

Yleisimmät virheet

  • raskas logiikka requestissa
  • ei batch processingia
  • WP-Cron ilman server cron -triggeriä
  • ei retry-logiikkaa
  • ei lockingia
  • kaikki käsitellään synkronisesti

Paras arkkitehtuuri

Kevyt mutta skaalautuva malli:

  • custom queue table
  • WP-Cron + server cron
  • batch processing
  • Redis locks
  • retry system
  • monitoring
  • async requests
  • idempotentit jobit

Yhteenveto

Background processing on yksi tärkeimmistä tavoista tehdä WordPressistä nopeampi ja skaalautuvampi ilman raskaita lisäosia tai monimutkaisia järjestelmiä. Kun raskaat operaatiot siirretään taustalle, käyttäjärequestit pysyvät kevyinä ja palvelin kuormittuu huomattavasti vähemmän.

Yksinkertainen queue-rakenne, WP-Cron, batch processing ja Redis-pohjainen locking riittävät pitkälle myös vaativissa WordPress-ympäristöissä.

🍪