web-dev-qa-db-fra.com

Plusieurs tâches cron wp_schedule_event dans le plug-in entraînent une exécution multiple

au cours de la dernière semaine, j'ai travaillé sur des tâches cron pour un site Web immobilier qui contient des centaines de mises à jour/suppressions et de nouvelles publications ajoutées chaque jour. Je suis très proche de la fin maintenant et cherche à planifier trois WordPress pour prendre en charge le processus.

Le code que j'ai lié ci-dessous fonctionne et envoie-moi un email avec la sortie (avec les deuxième et troisième événements commentés). Le problème survient lorsque je supprime les commentaires des travaux 2 et 3. Le plug-in s'active correctement, mais lorsque les travaux commencent à s'exécuter, je reçois beaucoup de courriels en double.

REMARQUE ** Il s'agit d'un site Web à fort trafic qui peut être touché plusieurs fois lors de la planification de l'événement. Une partie de la lecture que je faisais mentionne que le wp-cron a eu quelques problèmes connus traitant des scripts longs et peut se chevaucher.

Cela étant dit, je me demande si mes tâches cron sont trop volumineuses pour que la fonctionnalité wp-cron soit gérée. Est-ce que cela me force à activer DISABLE_WP_CRON dans mon fichier wp-config.php et à utiliser le planificateur cron fourni par mon hôte? Ou est mon problème dans la façon dont j'ai créé mon plugin?

Merci d'avance!

register_activation_hook(__FILE__,'cron_activation');
register_deactivation_hook(__FILE__,'cron_deactivation');

function cron_activation(){  
  wp_schedule_event(time()+60, 'daily', 'first_hook');
  //wp_schedule_event(time()+420, 'hourly', 'second_hook');
  //wp_schedule_event(time()+840, 'hourly', 'third_hook');
}

function cron_deactivation(){  
  wp_clear_scheduled_hook('first_hook');
  //wp_clear_scheduled_hook('second_hook');
  //wp_clear_scheduled_hook('third_hook');
}


add_action( 'first_hook', 'first_hook_function' );
//add_action( 'second_hook', 'second_hook_function' );
//add_action( 'third_hook', 'third_hook_function' );

function first_hook_function(){ 
  //code to run takes 2 minutes.
  //sends output as email to me for inspection
}

function second_hook_function(){
  //code to run takes 3 minutes.
  //sends output as email to me for inspection
}

function third_hook_function(){
  //code to run takes 4 minutes.
  //sends output as email to me for inspection
} 

P.S. J'espère avoir suivi le bon format, c'est mon premier post!

Edit: Pour clarifier mes questions, est-il possible d’exécuter ces fonctions (2 à 4 minutes) à partir du même plugin en utilisant la méthode wp-cron?

3
Entrit

Peut-être que le problème survient parce que vous ne vérifiez pas si votre hook est déjà planifié.

if ( !wp_next_scheduled( 'first_hook' ) ) {
    wp_schedule_event(time()+60, 'daily', 'first_hook');
}
1
Kirill

En général, utiliser le Alternative Cron est plus fiable. J'ai essayé de faire une démo en utilisant votre exemple de code pour reproduire ce qui était vu:

<?php
/*
* Plugin Name: Overlapping Cron Test
* Author: futuernorn
*/

register_activation_hook(__FILE__,'cron_activation');
register_deactivation_hook(__FILE__,'cron_deactivation');

function cron_activation(){
  wp_schedule_event(time()+30, 'daily', 'first_hook');
  wp_schedule_event(time()+60, 'hourly', 'second_hook');
  wp_schedule_event(time()+90, 'hourly', 'third_hook');
}

function cron_deactivation(){
  wp_clear_scheduled_hook('first_hook');
  wp_clear_scheduled_hook('second_hook');
  wp_clear_scheduled_hook('third_hook');
}


add_action( 'first_hook', 'first_hook_function' );
add_action( 'second_hook', 'second_hook_function' );
add_action( 'third_hook', 'third_hook_function' );

function first_hook_function(){
  //code to run takes 2 minutes.
  //sends output as email to me for inspection
  sleep(30);
  $crontest_data = get_option( '_crontest_data' );
  $crontest_data[] = 'first_hook_completed: '.date('Y-m-d H:i:s');
  update_option('_crontest_data', $crontest_data);
}

function second_hook_function(){
  //code to run takes 3 minutes.
  //sends output as email to me for inspection\
  sleep(60);
  $crontest_data = get_option( '_crontest_data' );
  $crontest_data[] = 'second_hook_completed: '.date('Y-m-d H:i:s');
  update_option('_crontest_data', $crontest_data);
}

function third_hook_function(){
  //code to run takes 4 minutes.
  //sends output as email to me for inspection
  sleep(90);
  $crontest_data = get_option( '_crontest_data' );
  $crontest_data[] = 'third_hook_completed: '.date('Y-m-d H:i:s');
  update_option('_crontest_data', $crontest_data);
}

Avec la fonctionnalité normale wp-cron en place et un ensemble complexe de trafic simultané, nous ne voyons qu'une entrée par cron même si:

testsite$ wp plugin activate crontest
Success: Plugin 'crontest' activated.
testsite$ for i in {1..10}; do curl -b -s $WEBSITE_URL 1>/dev/null; done
testsite$ for i in {1..10}; do curl -s $WEBSITE_URL 1>/dev/null; done
testsite$ wp option get _crontest_data
array (
  0 => 'first_hook_completed: 2015-11-09 19:49:25',
  1 => 'second_hook_completed: 2015-11-09 19:50:25',
  2 => 'third_hook_completed: 2015-11-09 19:51:55',
)

Puisque je ne peux pas tout à fait reproduire ce que vous voyez, il peut être utile d’avoir un peu plus d’informations ici.

0
futuernorn