web-dev-qa-db-fra.com

Quand utiliser wp_schedule_single_event pour les processus asynchrones/non bloquants?

J'ai remarqué ce modèle dans certains plugins ces derniers temps:

<?php
function MY_CRON(){
  wp_schedule_single_event(time(), 'MY_ACTION');
}
add_action('save_post', 'MY_CRON');

function MY_FUNCTION(){
  // YOUR CODE HERE
}
add_action('MY_ACTION', 'MY_FUNCTION');

Cela évitera d'exécuter des fonctions complexes sur les points d'ancrage que vous souhaitez utiliser. Il peut s'agir de "save_post", d'un appel via AJAX ou, comme dans mon cas, d'une nouvelle commande dans Woocommerce. Il est décrit plus en détail dans ces articles:

  1. Fonctions asynchrones dans Wordpress
  2. Utilisez WP Cron pour déclencher des tâches d'arrière-plan asynchrones dans WordPress lors de l'enregistrement ou de la mise à jour de post

J'espérais obtenir l'avis d'autres développeurs sur ce modèle.

Mon problème avec cette approche est que a) si vous avez un trafic faible sur votre site, il risque de ne jamais fonctionner en raison de la façon dont fonctionne WP Cron. Et b) si vous réalisez des opérations très complexes qui prennent, disons, 10 secondes, cela ne retardera-t-il pas le rendu de la page la prochaine fois que WP Cron sera déclenché par un chargement de page? Donc, mes actions administratives sont vraiment rapides et je ferme le navigateur, mais le prochain utilisateur qui visite le site aura un temps de chargement supplémentaire de 10 secondes? Donc, tout ce que je fais, c'est de laisser le temps d'attente à quelqu'un d'autre? Dans certains cas, cela pourrait même être moi-même.

Ma conclusion était donc de désactiver WP Cron et de planifier un appel à wp-cron.php? Doing_cron via crontab. Mais cela ne bloquera-t-il pas mon site pendant son fonctionnement?

1
Jan Beck

... si vous avez un trafic faible sur votre site, il risque de ne jamais fonctionner en raison du fonctionnement de WP Cron

Dans votre exemple particulier, il devrait toujours tirer. Étant donné que save_post est exécuté juste avant une redirection de navigateur, la demande suivante de nouveau à l'écran d'édition déclenche le programme cron.

... cela ne retardera-t-il pas le rendu de la page la prochaine fois que WP Cron sera déclenché par un chargement de page?

Non. Si vous extrayez spawn_cron() , vous verrez qu'il envoie une demande parallèle pour traiter la planification.

De le codex :

Envoyer une requête pour exécuter cron via une requête HTTP qui n'arrête pas le chargement de la page. Ne fonctionnera pas plus d'une fois toutes les 60 secondes.

1
TheDeadMedic