Een CMS zoals WordPress voert taken standaard uit op de voorgrond. Dit is voor bezoekers merkbaar en gaat ten koste van de laadervaring. In dit artikel leg ik daarom graag uit hoe je WordPress-taken op de achtergrond uitvoert. Zo ondervinden de bezoekers van je website geen hinder van dit soort acties. Lees verder en bekijk hoe je dit met WP-Cron regelt.
Inhoudsopgave
Wat zijn taken?
Om een WordPress-website en alle inhoud ervan goed te laten werken, voert WordPress regelmatig taken uit. Denk aan een taak die controleert of het CMS up-to-date is of een taak vanuit een plugin die bijvoorbeeld data in je webshop vanuit externe bron importeert. Al deze taken worden door het wp-cron.php-script standaard gelijktijdig uitgevoerd als een bezoeker naar je website komt. Bij met name grotere websites en webshops die zwaardere taken moeten uitvoeren, kan dat dan merkbaar zijn in de laadsnelheid.
De ‘normale’ oplossing
Wil je dit oplossen, dan lees je in veel documentatie dat je wp-cron.php via wget of curl in een cronjob moet automatiseren. Je simuleert zo een bezoeker die specifiek de WordPress-taken laat lopen. Deze aanvraag gaat echter via de webserver, waardoor het iets trager is. Daarnaast loop je hierdoor snel tegen PHP-instellingen en -limieten aan. Die zijn er bewust om te voorkomen dat een bezoeker je website gemakkelijk kan overbelasten. Kortom, het gaat eigenlijk nog steeds via de voorgrond.
Gelukkig kun je wp-cron.php ook geheel op de achtergrond aanroepen. Het wp-cron.php-script draait dan direct via CLI. Hierdoor heb je meer invloed hoe dit proces draait en kun je zelfs bepalen hoeveel rekenkracht daaraan mag worden besteed. Zo blijft je website voor bezoekers constant snel draaien.
Kalm aan en rap een beetje!
Met een cronjob PHP aanroepen via CLI heeft een belangrijk voordeel. Je kunt zo aangeven met hoeveel prioriteit en rekenkracht het WP-Cron-script moet worden uitgevoerd. Je hebt daardoor meer invloed op het proces en draait het direct zonder overhead van de webserver.
Die invloed is handig, omdat scripts standaard de neiging hebben om het met volle rekenkracht te draaien. Een gevolg is dat het dan alsnog merkbaar kan zijn voor bezoekers van je website. Gebruik daarom de volgende commando’s om er grip op te houden.
Voorbeeldwaardes aanpassen
Vervang in onderstaande commando’s telkens ‘deb1234’ en ‘jedomein.nl’ met je eigen deb-nummer en domeinnaam.
Cpulimit
Met cpulimit geef je aan hoeveel procent rekenkracht van een processor-core een proces mag gebruiken. Wens je dat een proces maar op één core van je pakket draait, dan resulteert dat in bijvoorbeeld het volgende commando.
cpulimit --limit 100 /usr/local/bin/php /home/deb1234/domains/jedomein.nl/public_html/wp-cron.php
Nice
Met nice bepaal je hoeveel prioriteit een proces krijgt ten opzichte van een andere proces die op dat moment draait. Dit gaat om een getal tussen de 0 (hoogste prioriteit) en 19 (laagste prioriteit). Je voorkomt zo dat een zwaar proces andere processen onderdrukt. Dit komt dan neer op bijvoorbeeld het onderstaande commando.
nice -n 10 /usr/local/bin/php /home/deb1234/domains/jedomein.nl/public_html/wp-cron.php
Ionice
Ionice regelt met hoeveel prioriteit er data naar de opslag mag worden gelezen en geschreven. Dit wordt ook wel I/O genoemd. Hier kun je een getal kiezen tussen 1 (hoogste prioriteit) en 3 (laagste prioriteit). Bij een zware taak is aan te raden om voor prioriteit 3 te kiezen, omdat processen dan met laagste idle-prioriteit acties uitvoeren naar de opslag. Andere processen krijgen hierdoor altijd voorrang, zoals een proces van een bezoeker op een website. Dit komt neer op het volgende commando.
ionice -c3 /usr/local/bin/php /home/deb1234/domains/jedomein.nl/public_html/wp-cron.php
Start met WordPress
Wil jij ook een WordPress-website? Met WordPress voorgeïnstalleerd, gratis SSL en automatische backups kies je bij Antagonist voor een compleet pakket!
Klinkt goed, maar hoe stel je dit in?
Gelukkig gaat de cronjob instellen een stuk sneller dan het lezen en verdiepen in de bovenstaande theorie. Het uitschakelen van de WP-Cron en toevoegen van de cronjob gaat in DirectAdmin als volgt.
1. Open het wp-config.php-bestand van je WordPress-installatie. Dit kan via het bestandsbeheer in DirectAdmin. Zoek daar de volgende regel op.
/* That's all, stop editing! Happy blogging. */
Voeg boven deze regel het onderstaande toe en sla daarna het bestand op.
define( 'DISABLE_WP_CRON', true );
2. Ga nu in DirectAdmin naar Geavanceerde functies → Cronjobs en klik rechts bovenin op ‘Cronjob aanmaken’.
3. Vul in het opdracht-veld het volgende commando in. Vervang ‘deb1234’ met de gebruikersnaam van je hostingpakket en ‘jedomein.nl’ met je eigen domein. Deze waarden zijn veilig en werken over het algemeen direct goed.
cpulimit --limit 100 ionice -c3 nice -n 10 /usr/local/bin/php /home/deb1234/domains/jedomein.nl/public_html/wp-cron.php
4. Klik nu op ‘Voorkom e-mails’, zodat je niet wordt overspoeld met e-mails als de cronjob wordt uitgevoerd. Klik ten slotte op ‘Aanmaken’.
Nieuwe werking van WP-Cron controleren
Na grote wijzigingen is het altijd verstandig om naderhand te controleren of alles nog goed functioneert. De werking van WP-Cron kan het makkelijkst nagekeken worden in de WordPress Sitediagnose. Je kunt dit onderdeel in je WordPress Dashboard vinden via Gereedschap ⟶ Sitediagnose.
Ervan uitgaande dat de WP-Cron goed functioneert, zal de check daarvoor onderdeel zijn van de geslaagde tests (Geplande events draaien nu).
Volledige inzage in WP-Cron
Met behulp van de gratis plugin WP-Crontrol kun je alle ingeplande taken inzien en beheren.
Verder optimaliseren?
Als je deze stappen hebt gevolgd, dan wordt de cronjob van WordPress netjes op de achtergrond uitgevoerd. Zo is je website nog een stukje sneller! Hopelijk heb je wat aan dit artikel gehad. Mocht je nu de smaak van optimaliseren te pakken hebben, bekijk dan ook eens hoe je database-optimalisatie uitvoert en Redis instelt. Veel succes!
P.S. Blijf op de hoogte en volg ons via Facebook, X, Instagram, e-mail en RSS. Heb je vragen, tips of opmerkingen? Laat het achter als reactie. Vond je het artikel nuttig? Deel het dan met anderen!
Wat een goeie tip! Dank daarvoor.
Bij het maken van de cronjob laat je de sterretjes staan bij de tijden. Wat betekent dit? Ik zou verwachten dat je op zijn minst moet aangeven wanneer de conjob uitgevoerd moet worden (bijv. elke 10 minuten).
Graag gedaan, Roel! Met de vijf asterisken geef je aan dat de cron-taak elke minuut moet worden gedraaid. In feite zeg je zo dat dit elke minuut, van elk uur, van elke maand en op elke dag in de week moet gebeuren. Staat er niets gepland, dan sluit de taak weer snel. Het kan dus geen kwaad deze frequentie aan te houden.
Toffe tip en direct toegepast op één domein. Maar hoe zorg je dat je binnen één hostingpakket, de verschillende domeinen deze cronjob laat uitvoeren ipv WordPress. Dat ontbreekt nog in de uitleg, want nu bots ik daar telkens op een error.
Fijn dat je wat aan deze tip had! Wat betreft je vraag: eerst voeg je de regel aan het wp-config.php-bestand toe in de public_html-map van dat domein. Vervolgens check je bovenaan in DirectAdmin of je bij ‘Domein’ het juiste domein hebt geselecteerd. Je gaat dan naar ‘Geavanceerde functies’ → ‘Cronjobs’ en stelt voor dat domein de cronjob in. Loop je daarmee vast, stuur dan gerust een e-mail naar support@antagonist.nl. Als je daarin aangeeft welke stappen je precies neemt en welke foutmelding je krijgt, dan kijken we graag even met je mee!
Maakt het uit wáár in wp-config.php je dit plaats?
define( ‘DISABLE_WP_CRON’, true );
Kan ik het overal plaatsen na “<?php"?
Ik heb plaats de regels nu helemaal bovenaan in wp-config.php.
<?php
define( 'WP_CACHE', true ); // Added by WP Rocket
define( 'WP_AUTO_UPDATE_CORE', true);
define( 'WP_POST_REVISIONS', 3); // Reduce post revisions
define( 'AUTOSAVE_INTERVAL', 160); // Lower autosave interval
define( 'DISABLE_WP_CRON', true); // External cronjobs are managed with Antagonist
Idealiter plaats je het in de wp-config.php tussen deze regels:
Mocht de bovenste regel er in jouw geval niet staan, dan plaats je het net boven deze regel:
Zie ook dit gedeelte in het artikel.