Dois-je désactiver WP_CRON et déclencher à la place wp-cron.php à partir du serveur toutes les quelques minutes?

12

On dirait que WordPress déclenche inutilement WP CRON à chaque chargement de page. Je pense qu'au lieu de l'exécuter à chaque visite, pourquoi ne pas simplement le planifier pour qu'il s'exécute toutes les 5 minutes via le serveur? Je pourrais simplement déclencher wp-cron.php toutes les cinq minutes et obtenir le résultat souhaité?

Y a-t-il un inconvénient à cela?

TheBigK
la source

Réponses:

15

Il n'y a aucun inconvénient à exécuter WP CRON à l'aide des tâches cron du serveur. En fait, c'est la pratique recommandée.

Selon le document officiel de développement du plugin WordPress :

WP-Cron ne s'exécute pas en continu, ce qui peut être un problème s'il existe des tâches critiques qui doivent s'exécuter à temps. Il existe une solution simple à cela. Configurez simplement le planificateur de tâches de votre système pour qu'il s'exécute aux intervalles que vous désirez (ou à l'heure précise nécessaire).

Pour ce faire, vous devez d'abord désactiver le comportement cron par défaut dans wp-config.php:

define('DISABLE_WP_CRON', true);

Ensuite, planifiez à wp-cron.phppartir de votre serveur. Pour Linux, cela signifie:

crontab -e

Cependant, au lieu de l'exécuter en ligne de commande (CLI), exécutez-le en tant que requête HTTP. Pour cela, vous pouvez utiliser wget:

*/5 * * * * wget -q -O - https://your-domain.com/wp-cron.php?doing_wp_cron

WordPress charge tous les fichiers de base, plugins, etc. requis wp-cron.phpavec le CODE suivant:

if ( !defined('ABSPATH') ) {
    /** Set up WordPress environment */
    require_once( dirname( __FILE__ ) . '/wp-load.php' );
}

Alors ne vous inquiétez pas si WordPress ne charge pas de fonctionnalités importantes.

Fayaz
la source
1
La documentation WordPress.org que vous avez liée aux mentions wget http://YOUR_SITE_URL/wp-cron.phpsans l'ajout de ?doing_wp_cron So est-elle meilleure que l'autre? Que fait l'ajout de ?doing_wp_cronce que la non-version ne fait pas?
Garconis
Probablement juste pour que vos journaux affichent la chaîne de requête afin que vous sachiez comment elle a été appelée avec certitude.
Slbox
1
Je ne suis pas du tout d'accord avec cela. Tout d'abord, ce n'est pas vrai que c'est "recommandé". Deuxièmement, cette méthode paralysera tous les plugins qui utilisent la méthode réellement recommandée de planification des événements. Je pense que c'est vraiment un mauvais conseil. Presque personne ne devrait désactiver le cron, sauf si vous avez une raison TRÈS spécifique de le faire. La seule raison pour laquelle je peux penser est que vous rompez WordPress pour un CDN ou quelque chose. Ce n'est PAS une pratique normale.
John Dee
1
@JohnDee: cette méthode ne désactive pas réellement cron, elle désactive la méthode WP Cron qui vérifie et tente d'exécuter des tâches cron à chaque chargement de page. define('DISABLE_WP_CRON', true);désactive uniquement cette partie du processus cron, puis appeler le script cron avec du code comme: */5 * * * * wget -q -O - https://your-domain.com/wp-cron.php?doing_wp_cronsur le serveur s'assure que les tâches cron sont exécutées. Tout plugin de planification ne connaîtra même pas la différence.
Fayaz
1
Le lien vers la documentation WordPress.org sur ce sujet a été remplacé par developer.wordpress.org/plugins/cron/…
aldemarcalazans
2

Il y a quelques inconvénients: Premièrement, lors de l'utilisation de wp-cron.php en tant que cli, des choses telles que les variables $ _SERVER ne sont pas définies. Les utilisateurs surmontent cette limitation en utilisant à la place une requête curl vers wp-cron.php.

Deuxièmement, parce que WP lui-même n'est pas chargé avec wp-cron.php; si vous utilisez un plugin de messagerie SMTP, celui-ci ne sera pas chargé lors de l'appel à wp-cron. Encore une fois, l'utilisation d'un appel curl remplace ce problème. Curl semble être la méthode la plus utilisée.

Pourtant; Je préfère utiliser wp-cli après avoir défini les paramètres de messagerie dans postfix et (pour nginx) php-fpm config correctement et défini un crontab tel que

*/5    *   *   *   *  wp cron event list --skip-plugins --skip-themes --path="/var/www/vhosts/example.com/httpdocs/wp" --fields=hook,next_run_relative --format=csv | awk -F, '$2=="now" {print $1}' | xargs -r wp --path="/var/www/vhosts/example.com/httpdocs/wp" cron event run $1

(Répertoriez tous les crons avec des champs spécifiques au format csv - hook étant le nom du cron, le prochain cycle relatif est le temps. Supprimez ceux montrant 'maintenant' comme le prochain cycle (ceux qui sont dus maintenant) en utilisant AWK, passez cette liste à xargs pour faire appel wp cron event run $HOOKà chaque cron.) L'utilisation de wp-cli charge correctement WordPress (je choisis de sauter les plugins lors de la liste des crons, car les erreurs de code et les avertissements php vont bousiller la sortie scriptée; mais pas de les ignorer lors de l'exécution du cron avec xargs, comme le cron peut nécessiter le chargement des plugins)

J'espère que cela vous donne quelques conseils sur ce qu'il faut rechercher.

TechnicalChaos
la source
2
Que diriez-vous de la configuration: / 15 * * * wget -q -O - votredomaine.com/wp-cron.php?doing_wp_cron comme suggéré par TomMcFarlin - tommcfarlin.com/wordpress-cron-jobs . Semble bien faire le travail. J'apprécierais votre commentaire.
TheBigK
Oui, comme je l'ai mentionné tout au long, les gens choisissent d'utiliser curl (wget ou tout autre appel http) pour déclencher les crons, et il n'y a rien de mal à cette méthode. Je conseillais simplement les problèmes d'appeler directement le fichier php wp-cron, qui n'inclurait pas les fichiers requis, et de conseiller une autre méthode alternative si vous vouliez le pimenter un peu.
TechnicalChaos
0

Il y a plusieurs raisons de ne pas désactiver le wp-cron. En fait, il est presque impossible de trouver un cas d'utilisation pour ce faire. Cela ne ralentit pas votre site et il est utilisé pour des choses que vous ne connaissez peut-être pas.

De nombreux plugins utilisent le WP-Cron pour planifier des choses. Ils peuvent devenir confus si vous désactivez le planificateur.

Il y a une prolifération de tutoriels sur ce sujet car il est déroutant et parce que cela ne fait pas grand-chose à votre site lorsque vous le désactivez. Ce qu'il va faire, c'est causer un mal de tête au développeur qui doit résoudre le mystérieux problème qu'il crée en six mois.

De plus, le WP Heartbeat se déclenche toutes les 15 secondes dans la zone d'administration, résolvant ce problème pour 99% des personnes qui pensent l'avoir.

John Dee
la source
2
C'est une réponse terrible - ils ne désactivent PAS WP Cron. Ils désactivent simplement l'invocation de WP Cron sur pageload et le déchargent à la place sur le démon cron système. Sheesh.
Barry Chapman
Quoi qu'il en soit, la principale raison de le laisser seul est que de nombreux plugins utilisent maintenant le cron pour une tâche d'arrière-plan étendue en cours d'exécution. Vous pouvez gâcher quelque chose que la personne NEXT fait, car elle s'attend à ce que le système fonctionne de manière standard. Bonne chance!
John Dee
si un plugin est codé d'une manière qui se brise totalement si wp cron est désactivé, cela signifie qu'il a été programmé par un incompétent, et il est préférable de le désinstaller immédiatement.
Magnetic_dud
Eh bien, les deux commentaires ici prouvent mon point. Vous avez un développeur qui dit: "cela ne désactive pas cron, il le mélange à l'OS cron" - ce qui est une rupture dans WordPress, qui est neutre pour le système d'exploitation. Puis un autre développeur dit "hé, c'est la responsabilité du développeur du plugin de planifier l'annihilation de wp cron." Euh, ok. Donc, si vous voulez une fonctionnalité cron, vous devez PLANIFIER l'élimination du système cron? À quoi? Le système cron de sauvegarde? Ce commentaire n'a pas de sens [évidemment].
John Dee
Quoi qu'il en soit, l'état actuel est "TOTAL CONFUSION". Voilà l'état actuel. La seule solution, à partir d'un PDV de cadre, est de dire aux gens: IL Y A UNE RAISON QUI EXISTE LE SYSTÈME WP-CRON. NE L'ARRÊTEZ PAS. L'autre option est de 10 000 opinions différentes et différentes. C'est ce que nous avons maintenant.
John Dee
0

Je n'ai pas encore trouvé de véritable inconvénient au déchargement de wp-cron vers un service externe. Faire cela depuis de nombreuses années maintenant.

Surtout dans le monde d'aujourd'hui où vous pouvez exécuter des applications en tant que microservices.

J'utilise des conteneurs Docker séparés pour chaque composant WordPress - php, web, db, crontab, redis, etc.). Ayant crontab comme conteneur séparé, appelant wp-cron via http en utilisant le réseau local, ne fonctionnant que lorsque j'en ai besoin.

Cela réduit le stress sur les nœuds principaux et améliore la sécurité en ayant une surface d'attaque plus petite.

Si le développeur ne peut pas comprendre comment faire des choses sans avoir à appeler wp-cron à chaque chargement de page, diable, cela parle simplement d'inexpérience en son nom. "Laissant ça tranquille", parce que vous ne comprenez pas comment les choses fonctionnent n'est pas une bonne raison de le garder.

Radoslav Stefanov
la source