web-dev-qa-db-fra.com

Forcer Cron à ne s'exécuter que sur un serveur

Etant donné qu'un site fonctionnant sur les serveurs A et B avec un équilibreur de charge, une base de données partagée/etc, et une tâche wp-cron normale, comment puis-je m'assurer que wp-cron ne fonctionne que sur le serveur A, jamais sur le serveur B?

1
Tom J Nowell

Je teste actuellement ceci dans wp-config.php:

if ( php_uname('n') == 'wp4' ) {
    define('DISABLE_WP_CRON', true);
}

Où wp4 est le nom du deuxième serveur de l'installation

0
Tom J Nowell

Je créerais une constante dans le wp_config.php définissant le serveur sur lequel vous vous trouvez. Jusqu'ici tout va bien, pas vraiment magique.

La partie délicate, comme vous l'avez mentionné, est de faire fonctionner le cron avec certitude, et de ne pas abandonner s'il s'agit accidentellement du mauvais serveur. Essayez la fonction comme ceci:

function my_cron_callback() {
    if ( MY_SERVER_SETUP == "SERVER_A" ) {
        do_the_cron_action();
    } else {
        set_transient( 'do_the_cron_on_server_a', 'true' );
    }
}

Maintenant, vous avez un ensemble transitoire lorsque le cron s'exécute sur l'autre serveur, mais n'est pas exécuté. La fonction do_the_cron_action contient votre script.

La dernière étape consiste à relier une fonction à la init, en vérifiant si le serveur est ServerA et si le transitoire est défini.

function check_if_a_should_execute() {
    if( MY_SERVER_SETUP == "SERVER_A" && get_transient( 'do_the_cron_on_server_a' == 'true' ) {
        do_the_cron_action();
        delete_transient( 'do_the_cron_on_server_a' );
    }
} 
add_action( 'init', 'check_if_a_should_execute' );

Cela devrait faire l'affaire.

1
fischi