Skip to main content

WordPress sneller maken – Externe Cronjob

By 15 mei 2017januari 7th, 2019Wordpress

Lees hier hoe je WordPress sneller kan maken met een externe Cronjob. Dit artikel is onderdeel van “Tips om WordPress veiliger en sneller te maken”.

Even een WordPress site opzetten is zo gedaan. Maar een goede site opzetten is dat zeker niet. Als je het goed wil doen, dan laat je het door een expert doen. Voor degene die technisch ingesteld is en wel iets wil optimaliseren kan met de volgende info aan de slag.

WordPress Cronjob uitzetten

Een belangrijke feature van WordPress is dat het automatisch bepaalde taken kan uitvoeren. Stel je wilt om de volgende dag om 09:00 een blog posten, WordPress kan dat. Of je wilt dagelijks een backup laten maken voor het geval er een keer iets fout gaat. Door middel van een automatisch ingestelde taak hoef je je geen zorgen meer te maken.

Maar dit voordeel heeft ook een keerzijde. Elke keer dat je website wordt bezocht wordt de taakplanner ook gestart. Is er een process dat moet worden uitgevoerd dan start hij dat automatisch. Of er nu wel of geen taak staat gepland, de bezoeker zal hiervan niets zichtbaars zien. Wel kost dit script elke keer tijd. Dat proces kunnen wij versnellen.

Voordat je verder gaat is het goed te achterhalen of de hosting partij waar jij je website hebt gehost de mogelijkheid biedt om een cronjob in te stellen.

In WordPress wordt de interne Cronjob ook wel WP Cron genoemd. Deze gaan wij uitzetten. Hiervoor gaan wij code toevoegen in het bestand wp-config.php. Voeg de code toe ergens op regel 38, maar na de database connectie.

wp-config.php
38

39

40

// Uitschakelen interne WP-Cron | 2develop.nl

define(‘DISABLE_WP_CRON’, true);

define( ‘WP_CRON_LOCK_TIMEOUT’, 240 );

De eerste regel DISABLE_WP_CRON is duidelijk. Hiermee zet je de interne Cronjob uit.
De tweede regel WP_CRON_LOCK_TIMEOUT is ook belangrijk. Hierdoor zorgen wij dat WordPress niet overbelast raakt door heel vaak de Cron te starten. De cijfers erachter staan voor het aantal seconden voordat een externe CronJob weer toegang krijgt. Ik heb hem in dit voorbeeld dus ingesteld op 4min.

 

Externe Cronjob aanzetten

WordPress maakt het mogelijk om die automatische taakplanner uit te schakelen. Natuurlijk wil je niet inleveren op deze feature, daarom kun je bij veel hostingpartijen een CronJob instellen. Dat houdt in dat je hostingpartij op een geplande tijd jouw website bezoekt en bekijkt of er iets in de taakplanner van WordPress staat.

In de configuratie panel van de webhosting kunnen wij een CronJob instellen. Dat kan er zo uitzien.

Een nieuwe externe CronJob instellen is net zoiets als het instellen van een taak. Je wilt op een bepaalde tijd iets laten uitvoeren. Het commando komt later aan bod.

Voorbeeld: Op maandag en woensdag start om 5 uur een backup.
Waardes: 0 5 * * 0,2 www.2develop.nl
Uitleg: Die eerste 0 betekent de 1ste minuut. 1ste minuut van 5 uur om precies te zijn. Op dag 0 en 2. Dag 0 = maandag, dus is 2 woesndag. De overige * die je ziet staan betekent “niet gedefinieerd, dus altijd*.

Voorbeeld: Om de 5 minuten controleren wij of er een post op de planning staat die dan online mag gaan. Maar dan alleen overdag tussen 08:00 en 19:00
Waardes: */5 8-19 * * * www.develop.nl
Uitleg: Die */5 betekent bijna altijd, om de 5 minuten. En deze Cronjob gebeurt alleen tussen 8-19 uur.

 

Cronjob command

Het commando is belangrijk. De webhosting weet om welke tijd hij iets moet gaan doen, maar wat eigenlijk? Dat komt in het commando veld te staan. Hier kun je verschillende waardes toevoegen. In dit voorbeeld gebruiken wij WGET.

Voorbeeld: /usr/bin/wget -O – http://www.jouwwebsite.nl/wp-cron.php?doing_wp_cron > /dev/null 2>&1
/usr/bin/wget” > Dit is de gebruikelijke manier om WGET aan te spreken. Het aanroepen ervan verschilt per server. Soms is het zonder /usr/bin/
-O –” > Er is een output
http://www.jouwwebsite.nl/wp-cron.php?doing_wp_cron” > Hier natuurlijk even je eigen website plaatsen. Als je een SSL certificaat gebruikt wordt het https
> /dev/null 2>&1” = Hierdoor zorgen wij dat er nergens een logfile wordt gemaakt en het bestand gewoon netjes wordt uitgevoerd.

Misschien vind je het handig om een logfile te maken. Dan weet je in ieder geval dat het script werkt. Natuurlijk hoeft dit niet, want als je een post hebt klaargezet om een bepaalde tijd, dan kom je er snel genoeg achter of die ook daadwerkelijk wordt gepuliceerd. Wil je wel een logfile, gebruik dan het volgende commando:

Voorbeeld: /usr/bin/wget -O – http://www.jouwwebsite.nl/wp-cron.php?doing_wp_cron >> log.txt
>> log.txt” = Hier wordt de output van WGET weggeschreven. Controlleer in de root van je files of het bestand ook daadwerkelijk wordt aangemaakt.  Open log.txt om te zien of er foutmeldingen in staan. Is hij leeg, dan gaat het goed.

Gefeliciteerd, jij hebt een CronJob ingesteld!!!

Lukt het niet, kijk dan hieronder bij de HELP onderwerpen. Ook 2develop helpt je graag!

 

Help 1) is het doing_wp_cron of doing_wp_cron=1

Op veel websites zie je uiteindelijk 2 links waarvan beweerd wordt dat die de cronjob starten.

www.WEBSITE.nl/wp-cron.php?doing_wp_cron
www.WEBSITE.nl/wp-cron.php?doing_wp_cron=1

Na zorgvuldig dit getest te hebben kan ik je vertellen dat het doing_wp_cron moet zijn. Als je doing_wp_cron=1 gebruikt, dan worden posts niet geupdate en krijg je foutmeldingen als ‘planning mislukt’. Dat dit fout gaat bij doing_wp_cron=1 is vrij logisch als je naar de source kijkt van de file die wordt aangeroepen.

wp-cron.php
71

72

73

74

75

76

77

78

79

80

81

82

83

// Use global $doing_wp_cron lock otherwise use the GET lock. If no lock, trying grabbing a new lock.

if ( empty( $doing_wp_cron ) ) {

if ( empty( $_GET[ ‘doing_wp_cron’ ] ) ) {

// Called from external script/job. Try setting a lock.

if ( $doing_cron_transient && ( $doing_cron_transient + WP_CRON_LOCK_TIMEOUT >

$gmt_time ) )

return;

$doing_cron_transient = $doing_wp_cron = sprintf( ‘%.22F’, microtime( true ) );

set_transient( ‘doing_cron’, $doing_wp_cron );

} else {

$doing_wp_cron = $_GET[ ‘doing_wp_cron’ ];

}

}

Als doing_wp_cron geen waarde mee krijgt, voert hij de volledige takenlijst uit. Maar geef je er een waarde aan, dan zal hij alleen de queue met die waarde uitvoeren.
Je ziet ook staan “Try setting a lock”. Dit hebben wij dus ook al ingesteld in de wp=config met de code “define( ‘WP_CRON_LOCK_TIMEOUT’, 240 )”.

 

Help 2) WGET werkt niet

Er zijn plugins die als firewall functioneren. Ter beveiliging kan het zijn dat WGET wordt tegengehouden. Controleer in het bestand .htaccess of er een regel bestaat met de tekst Wget erin. Het zou dit kunnen zijn:

.htaccess
1 RewriteCond %{HTTP_USER_AGENT} ^Wget [NC,OR]

Verwijder deze hele regel. (maak altijd een backup voordat je iets wijzigt aan een bestand)

 

Help 3) WGET werkt nog steeds niet

In plaats van WGET kun je misschien ook gebruik maken van php. Op andere websites vind je hier meer informatie over. Maar misschien werkt het volgende commando meteen voor je:

php -q /home/jouw-account-naam/public_html/wp-cron.php?doing_wp_cron > /dev/null 2>&1

 

 

Patrick Buijs