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?
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');
}
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.