Le Cron WordPress : problèmes et solutions

Temps de lecture : 8 minutes

Lapin Blanc © John Tenniel et logo WordPress
Partager sur LinkedIn
Partager sur Twitter
Partager sur Facebook

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 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

Quand
Toutes les minutes
Toutes 15 minutes
A certaines minutes (1, 21…)
Toutes les heures
Réglages
* * * * *
*/15 * * * *
1/21/41 * * * *
0 * * * *
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

Chez 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.

user@host:~$ wget http://www.example.com/wp-cron.php?doing_wp_cron
--2016-03-08 14:09:16--  http://www.example.com/wp-cron.php?doing_wp_cron
Résolution de www.example.com (www.example.com)… 213.187.33.20
Connexion à www.example.com (www.example.com)|213.187.33.20|:80… connecté.
requête HTTP transmise, en attente de la réponse… 200 OK .

Le code 200 indique une réussite.

 

user@host:~$ wget http://www.example2.com/wp-cron.php?doing_wp_cron
--2016-03-08 14:09:38--  http://www.example2.com/wp-cron.php?doing_wp_cron
Résolution de www.example2.com (www.example2.com)… 104.78.54.15, 104.78.54.15
Connexion à www.example2.com (www.example2.com)|104.78.54.15|:80… connecté.
requête HTTP transmise, en attente de la réponse… 403 Forbidden
2016-03-08 14:09:39 erreur 403 : Forbidden. .

Le code 403 indique une erreur.

En l’occurrence, il s’agissait d’un blocage de wget par l’extension iThemes Security.

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 Easycron

gratuit, 8$..50$/an

Logo Cronless

gratuit, 19$, 27$/an

Logo SetCronJob

10$..100$

Logo Cron-Job

gratuit

Logo Webcron

0.00011€/lancement

Logo Cronoo

1 000 crédits puis 0.0001€/lancement

Logo CronJobOnline

gratuit + 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.

[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.

Pour aller plus loin…

et enfin…

Best Cron Plugins for WordPress

Abonnez-vous à ma newsletter

Partagez cet article

5
Poster un Commentaire

avatar
4 Fils de commentaires
1 Réponses de fil
0 Abonnés
 
Commentaire avec le plus de réactions
Le plus populaire des commentaires
4 Auteurs du commentaire
Carl ConradDupuyCyrille Sansonfulano Auteurs de commentaires récents

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

  S’abonner  
plus récent plus ancien Le plus populaire
Notifier de
fulano
Invité
fulano

Ca ne fonctionne pas chez O2Switch
Même avec l’aide du support

Cyrille Admin
Administrateur
Cyrille Admin

Bonjour Fulano,

C’est étonnant.
En ce qui me concerne, ça à l’air de fonctionner.

Voici mes réglages :
– Paramètres communs : Deux fois par heure(0,30 * * * *)
– Commande : curl -I https://www.100son.net/wp-cron.php?doing_wp_cron >/dev/null 2>&1

A adapter en fonction du site à déclencher.

Dupuy
Invité
Dupuy

Bonjour,

J’ai configuré une tâche cron avec « 14 3 * * 3 » et « .wp-site/wp-cron.php » sur un hébergement OVH pour déclencher une tâche de backup (avec BackWPup) une fois par semaine, le mercredi à 3H14. Celle-ci ne semble pas se déclencher (peut être parce que je n’ai pas désactivé le cron de WP dans le wp-config).
Mais si je désactive le cron de WP avec la commande « define(‘DISABLE_WP_CRON’, ‘true’); » dans wp-config, que se passera-t’il pour les autres tâches (vérification des mises à jour entre autres) ?

Carl Conrad
Invité

Avec « 14 3 * * 3 », l’ensemble des tâches WordPress ne seraient lancées qu’une fois par semaine si le cron de WordPress était désactivé, ce n’est probablement pas souhaitable. Il faudrait les lancer bien plus souvent. Et activer un cron externe en parallèle de celui de WordPress n’a pas beaucoup de sens non plus, à moins que le site ne reçoive qu’un très faible trafic (en l’occurrence, moins d’une visite par semaine). Donc, le mieux serait de désactiver le cron de WordPress, d’activer un cron à une fréquence raisonnable qui lancera toutes les tâches prévues et de configurer… Lire la suite »

Cyrille Admin
Administrateur
Cyrille Admin

Merci Carl pour cette réponse à laquelle je souscris. 🙂

Er.V
Invité
Er.V

Bonjour,
Excusez-moi, je ne comprends pas, il faut ajouter la ligne de commande dans le fichier wp-cron.php ?
Si oui, à chaque mise à jour de WP, cela sera effacé, il faudra recommencer.
Merci

Cyrille Admin
Administrateur
Cyrille Admin

Bonjour,

Le fichier à modifier est wp-config.php.

Bonne journée,

Er.V
Invité
Er.V

Re Bonjour,
Pardon, mais la commande d’exemple là,
curl -I https://www.100son.net/wp-cron.php?doing_wp_cron >/dev/null 2>&1</code
Il faut la mettre dans wp-config.php ?
Je ne pensais que mettre que ce code
/** Stop du cron WordPress **/
define('DISABLE_WP_CRON', true);

Merci

ps: dommage pas d’option de notification pour les commentaires

Cyrille Admin
Administrateur
Cyrille Admin

Re bonjour Hervé,

La commande

curl -I https://www.100son.net/wp-cron.php?doing_wp_cron >/dev/null 2>&1

est à placer dans la tâche cron chez l’hébergeur.

P.S. : je viens d’ajouter un système d’abonnement aux commentaires.

Er.V
Invité
Er.V

Bonjour,
Merci, sur OVH, pas possible de régler les minutes ?
Merci

Cyrille Admin
Administrateur
Cyrille Admin

Bonjour,
Non, c’est une des raisons qui m’ont poussé à passer chez o2switch.
Regardez leur offre. De plus ils feront la migration de votre site.
Bonne journée,