Lapin Cron Wordpress

Le Cron WordPress : problèmes et solutions

La planification des tâches sous WordPress utilise un système de cron. Configuré automatiquement à l'installation, le cron WordPress peut poser des problèmes aux sites très fréquentés comme à ceux qui le sont peu. Nous allons voir pourquoi et comment corriger cela.

Pour qui ? Cet article s'adresse aux personnes qui commencent à maîtriser la partie administration système de WordPress, c'est-à-dire ce qui concerne l'installation, la sauvegarde, le clonage de site, la sécurisation...

Pourquoi ? J'en suis venu à rédiger cet article car, bien qu'ayant trouvé sur internet des didacticiels indiquant comment mettre en place un cron, ils ne m'ont pas permis de comprendre pourquoi cela ne fonctionnait pas chez moi.

Comment ? Il m'a fallu lire des dizaines d'articles pour arriver à trouver ce qui clochait. J'ai donc réuni ici tout ce qu'il me semblait nécessaire de savoir sur ce sujet. J'espère permettre à d'autres de gagner du temps dans la prise en main du cron WordPress.

Je veux juste voir le mode opératoire : go !

Au commencement était le cron

lapin cron WordPressCron est une abréviation de crontab, elle-même une abréviation de chrono table qui signifie table de planification (de Chronos, dieu grec du temps).

Issue du monde Unix, le programme cron, lancé au démarrage d'un système d'exploitation, permet de planifier l’exécution automatique de tâches avec une certaine fréquence ou à un moment donné.

En pratique le cron vérifie toutes les minutes sa liste de tâches, la crontab. Celle-ci contient les tâches à exécuter et leur horaire d'exécution avec éventuellement une périodicité.

Si le moment est venu, cron lance l'exécution de l'action en attente.

Tous les systèmes d'exploitation (Unix, Linux, Mac, Windows) utilisent un système de planification de tâches de type cron.

Il faut donner du cron à WordPress

Vérifier les mises à jour du cœur, des extensions et du thème, lancer une sauvegarde, envoyer un lot de newsletters... WordPress a lui aussi besoin de gérer des tâches.

Cette fonctionnalité est mise en œuvre à travers un cron WordPress qui repose sur deux fichiers /wp-cron.php et /wp-includes/cron.php

En tête du fichier /wp-cron.php :

<?php
/**
* WordPress Cron Implementation for hosts, which do not offer CRON or for which
* the user has not set up a CRON job pointing to this file.
*
* The HTTP request to this file will not slow down the visitor who happens to
* visit when the cron job is needed to run.
*
* @package WordPress
*/

WordPress est configuré par défaut pour utiliser ce fichier. Son activation se déclenche à chaque fois qu'un visiteur arrive sur votre site.

En tête du fichier /wp-includes/cron.php :

<?php
/**
* WordPress CRON API
*
* @package WordPress
*/

/**
* Schedules a hook to run only once.
*
* Schedules a hook which will be executed once by the WordPress actions core at
* a time which you specify. The action will fire off when someone visits your
* WordPress site, if the schedule time has passed.
*
* @since 2.1.0
* @link https://codex.wordpress.org/Function_Reference/wp_schedule_single_event
*
* @param int $timestamp Timestamp for when to run the event.
* @param string $hook Action hook to execute when cron is run.
* @param array $args Optional. Arguments to pass to the hook's callback function.
* @return false|void False when an event is not scheduled.
*/

Ce fichier contient l’API du cron WordPress.

Cron WordPress : allô Houston...

Ce mécanisme peut poser des problèmes en cas d'affluence (déclenchement trop fréquent du cron WordPress) tout comme si le site connaît une faible fréquentation (les tâches planifiées sont exécutées en retard).

Sachez que les tâches qui ne sont pas exécutées au moment prévu ne sont pas perdues pour autant. Elles sont placées dans une file qui attend le passage d'un visiteur pour être vidée.

Nous allons voir comment régler ce problème en mettant en place un vrai service de planification.

Mise en œuvre de solutions

Note : Inutile de préciser que ce didacticiel s'adresse à ceux qui utilisent un hébergement mutualisé. Le cron n'a pas de secret pour ceux qui savent configurer un serveur dédié.

Cela va consister à désactiver le déclenchement du cron WordPress puis mettre en place un service de tâches planifiées.

Désactiver wp-config.php

Pour cela, ajoutez la ligne suivante dans le fichier /wp-config.php. Ça évite le déclenchement par deux systèmes concurrent (visites et cron externe).

...
/** Stop du cron WordPress **/
define('DISABLE_WP_CRON', true);

/* C'est tout, ne touchez pas à ce qui suit ! Bon blogging ! */
...

Cette modification peut perturber certaines extensions.

WP Crontrol
There was a problem spawning a call to the WP-Cron system on your site. This means WP-Cron events on your site may not work.
The problem was: 
The DISABLE_WP_CRON constant is set to true. WP-Cron spawning is disabled.

ou

Updraft+
Attention : Le planificateur de sauvegarde est désactivé dans votre installation WordPress, par le biais du réglage DISABLE_WP_CRON. Aucune sauvegarde ne pourra débuter (même la sauvegarde immédiate) tant que vous n'aurez pas paramétré un moyen de lancer le planificateur manuellement ou tant que vous ne l'aurez pas activé. Aller ici pour plus d'information.

Pour le moment, j'ai pris le parti d'ignorer ces messages.

Activer un cron externe à WordPress

Deux cas de figure, selon que votre hébergeur propose ou non un service de planification de tâches.

1 - Hébergeur avec planificateur (ou sans)

Exemple : OVH, o2switch...

Dans ce cas, utilisez le planificateur de votre hébergeur pour déclencher les tâches de WordPress.

Quel que soit votre hébergeur, il vous faudra deux informations : la fréquence et la commande à lancer.

Fréquence

La fréquence devra être ajustée à la tâche qui se produit le plus souvent, sachant que la fréquence ne peut pas être au-dessous de la minute. En général, un déclenchement toutes les heures devrait suffire.

Les intervalles de temps par défaut de WordPress sont :

  • toutes les heures (hourly)
  • deux fois par jour (twicedaily)
  • une fois par jour (daily)

Note : OVH ne permet pas une fréquence supérieure à l'heure, tandis que chez o2switch elle peut aller jusqu'à la minute.

Pour connaître la liste des tâches de votre site et leur fréquence, utilisez l’extension WP Crontrol ou Advanced Cron Manager - debug & control.

Schéma de la syntaxe crontab

# +---------------- minute (0 - 59)
# |  +------------- heure (0 - 23)
# |  |  +---------- jour du mois (1 - 31)
# |  |  |  +------- mois (1 - 12)
# |  |  |  |  +---- jour de la semaine (0 - 6) (dimanche=0)
# |  |  |  |  |
  *  *  *  *  *  commande à exécuter

Ce qui donne par exemple

QuandRéglages
Toutes les minutes* * * * *
Toutes 15 minutes*/15 * * * *
A certaines minutes (1, 21...)1/21/41 * * * *
Toutes les heures0 * * * *

Commande

Là aussi, deux possibilités :

a) Lancer le fichier avec PHP

Cette méthode serait la plus efficace en terme de performance. Pour en savoir plus, je vous conseille de lire Running WordPress Cron via PHP-CLI (article en anglais).

Pour lancer le script directement en PHP, il faut que le service de tâches planifiées soit exécuté sur le serveur où se trouve le fichier wp-cron.php.

/usr/bin/php /chemin/complet/wp-cron.php

Ches o2switch, la commande pour le site par défaut est :

/opt/alt/php70/usr/bin/php ~/public_html/wp-cron.php >/dev/null 2>&1

Chez OVH faire pointer la tâche sur /répertoire_de_wordpress/wp-cron.php. OVH fourni un didacticiel pour configurer le système de tâches planifiées.

OVH Cron

Note : certains disent que les droits du fichier wp-cron.php doivent le rendre exécutable 755, d'autres que ce n'est pas nécessaire 644. Pour ma part, j'ai opté pour 644. Testez.

b) Lancer le script avec une URL

Cela permet de lancer la commande depuis un serveur qui n'est pas celui qui héberge le site.

Le programme utilisé pour visiter l'URL peut être wget ou curl selon votre hébergeur ou le service de cron (voir la documentation de votre fournisseur). Il peut aussi masquer le service qui va accéder à l'URL (EasyCron). Dans ce cas, vous n'aurez qu'à fournir l'URL.

0 * * * * wget -q -O - http://www.example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

ou

0 * * * * curl -s http://www.example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

Le fichier wp-cron.php se trouve à la racine du site.

Dans le cas d'un déclenchement par URL, l'appel au fichier wp-cron.php doit être suivi de ?doing_wp_cron. Édit (08/2017) : Une conversation sur le Slack WordPress-fr a conclu que ?doing_wp_cron ne serait pas indispensable.

>/dev/null 2>&1 renvoi la sortie du script et le message de réussite (1) ou d'erreur (2) vers /dev/null, c'est-à-dire un trou noir.

Documentation : wget et curl.

Vous pouvez tester l'appel à l'URL avec curl ou wget dans une console.


Exemples de retours

Attention : si vous utilisez iThemes Security, la liste noire de HackRepair.com bloque wget. Il faut alors utiliser curl ou retirer le blocage de wget dans le fichier .htaccess.

Pour tester le fonctionnement du planificateur, commencez avec une commande simple : par exemple, envoyer un mail toutes les minutes ou écrire dans un fichier. Voici un exemple de script d'envoi de mail.

2 - Hébergeur sans planificateur

Il existe des services spécialisés :

Logo Easycroneasycron.comgratuit, 8$..50$/an
Logo Cronlesscronless.comgratuit, 19$, 27$/an
Logo SetCronJobsetcronjob.com10$..100$
Logo Cron-Jobcron-job.orggratuit
Logo Webcronwebcron.org0.00011€/lancement
Logo Cronoocronoo.com1 000 crédits puis 0.0001€/lancement
Logo CronJobOnlinecronjobonline.comgratuit + logo ou payant

Certaines offres gratuites permettent de tester le service.

En ce qui concerne EasyCron (seul fournisseur que j'ai testé), il n'est pas possible d'activer les logs dans l'offre gratuite, ce qui rend difficile l'analyse quand cela ne fonctionne pas. De plus, il semblerait que certains appels au cron retournent une erreur (par exemple si le serveur de votre site a un problème ponctuel ou s'il met du temps à répondre). Dans ce cas, EasyCron désactive la tâche.

Une autre option passe par l'utilisation de IFTT. Voir le mode opératoire.

Si vous utilisez ces services ou d'autres, merci de laisser un commentaire. Je les ajouterai à cet article si besoin.

Alors, ça fonctionne ?

Pour voir si cela fonctionne, il faut attendre qu'un premier cycle se soit écoulé, vérifier que la prochaine tâche planifiée a bien été exécutée, puis regarder dans les logs de l'hébergeur si la tâche cron a été lancée.

Exemple de log OVH
[2016-03-07 00:43:03] ## OVH ## START - 2016-03-07 00:41:03.637658 executing: /usr/local/php5.6/bin/php /homez.xx/moncompte/www/wp-cron.php 
[2016-03-07 00:43:03] 
[2016-03-07 00:43:03] ## OVH ## END - 2016-03-07 00:41:05.442767 exitcode: 0
[2016-03-07 01:43:03] ## OVH ## START - 2016-03-07 01:41:03.534382 executing: /usr/local/php5.6/bin/php /homez.xx/moncompte/www/wp-cron.php 
[2016-03-07 01:43:03] 
[2016-03-07 01:43:03] ## OVH ## END - 2016-03-07 01:41:05.225793 exitcode: 0
 
.

La tâche a été lancée à 01h43 et "exitcode: 0" indique qu'elle s'est bien passée.

Cas particuliers

Certaines extensions comme MailPoet proposent d'activer leur propre cron.

Il semblerait que la mise en maintenance d'un site désactive le cron WordPress.

2 réflexions au sujet de “Le Cron WordPress : problèmes et solutions

Laisser un commentaire