web-dev-qa-db-fra.com

Commentaire est WP Verrouillage Cron implémenté?

WordPress prend des mesures pour s’assurer qu’une tâche périodique ne s’exécute pas deux fois, par exemple. une fois par heure quand un horaire horaire est donné, plutôt que de temps en temps deux fois à l'heure prévue.

Bien que ce ne soit pas infaillible, quelles sont les mesures prises par WordPress pour s’assurer que cela se produit aux heures planifiées, et une seule fois comme spécifié?

3
Tom J Nowell

Un transitoire est défini pour refléter l'état du cron, qui est supprimé lorsque toutes les tâches sont terminées. Toutes les demandes ultérieures sont ignorées si ce transitoire est trouvé ...

4
onetrickpony

la réponse de onetrickpony est généralement correcte. Si vous laissez WordPress agir par défaut ou si vous déclenchez manuellement wp-cron en récupérant son URL avec 'doing_wp_cron' défini sur une valeur unique dans la chaîne GET, vous pouvez vous attendre à ce que les tâches ne soient pas exécutées deux fois.

Mais si vous exécutez wp-cron.php à partir de la CLI PHP dans votre crontab, l’histoire est différente. Il vérifie maintenant une constante appelée WP_CRON_LOCK_TIMEOUT pour savoir si elle doit ignorer le verrou stocké dans le transitoire. Et il existe une condition de concurrence critique qui permet parfois d'exécuter le même travail deux fois.

Si vous voulez vraiment être sûr que le même travail ne s'exécute jamais deux fois, ne définissez pas DISABLE_WP_CRON ou n'utilisez pas curl ou wget dans votre crontab pour extraire wp-cron.php comme suit:

*/10 * * * * wget -q -O "http://www.example.com/wp-cron.php?doing_wp_cron=`date +\%s.\%N`" > /dev/null 2>&1

Notez également qu’un bogue dans 3.3 entraînait l’exécution de tâches à deux reprises si deux instances de wp-cron.php étaient lancées dans la même seconde. À présent, ils devraient être lancés dans la même microseconde, ce qui est encore possible, mais hautement improbable.

2
Alexander Garden