J'ai environ 20 wp_cron()
fonctions telles que le code suivant. Presque tous les crons fonctionnent toutes les heures; quelques-uns sont quotidiens.
if ( ! wp_next_scheduled( 'my_task_hook' ) ) {
wp_schedule_event( time(), 'hourly', 'my_task_hook' );
}
add_action( 'my_task_hook', 'my_task_function' );
function my_task_function() {
//Complex Code
}
Pour augmenter les performances du serveur, et pour ne pas continuer à recevoir des messages de limite de serveur des sociétés d'hébergement, je veux m'assurer qu'un seul cron s'exécute à un moment donné ... Est-ce possible?
La réponse actuellement acceptée est excellente, mais j'ai la question suivante, c'est pourquoi je commence une prime pour cette question.
Veuillez d'abord lire la réponse acceptée.
Supposons que Cron 1 fonctionne, mon code de cron2 ne fonctionnera pas parce que nous sommes encore dans les 5 minutes ou le premier cron fonctionne toujours, mais à cause de la wp_schedule_event( time(), 'hourly', 'my_task_hook' );
course pour cron2, je pense que WordPress considère que cron2 fonctionne ..... Donc, fondamentalement, le code du code cron2 n'a jamais fonctionné ..... Ou j'ai mal compris quelque chose?
Réponses:
Oui c'est possible...
Et pour être honnête, il est souvent très important de le faire ... WP Scheduler a parfois tendance à causer des problèmes, lorsque les tâches cron sont longues ...
Alors, comment résoudre ce problème?
J'utilise l' API Transients pour implémenter des sémaphores ...
Voici le code:
Pourquoi dois-je utiliser des transitoires dans ce cas? Parce que:
Et s'il y a beaucoup d'actions différentes à faire?
Supposons donc qu'il existe de nombreuses tâches cron différentes, qui ne devraient jamais s'exécuter en même temps, mais nous voulons toujours qu'elles s'exécutent toutes ...
Si nous utilisons la solution avec un sémaphore et n'utilisons qu'un seul sémaphore pour toutes ces tâches, alors certaines d'entre elles risquent de ne jamais s'exécuter. Que faire alors?
Dans ce cas, vous devez changer votre façon de penser. Vous n'avez pas de tâches indépendantes, mais une file d'attente de tâches à faire. Vous devez donc l'implémenter de cette manière.
Donc:
la source
delete_transient()
. Donc, le temps compte? Je veux dire à chaque fois que vous le mettezset_transient
, il est supprimé juste après que mon travail soit terminé ... Alors pourquoi il y a un temps?my_task_function_semaphore
comme nom pour transitoire, je dois utiliser tous les autres crons au même nom?