web-dev-qa-db-ja.com

Cronを1台のサーバーでのみ実行するように強制する

ロードバランサ、共有データベース/ etc、および通常のwp-cronタスクを使用して、サーバーAとサーバーBでサイトが実行されているとします。

1
Tom J Nowell

私は現在wp-config.phpでこれをテストしています:

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

Wp4は、セットアップ内の2番目のサーバーの名前です。

0
Tom J Nowell

wp_config.phpには、どのサーバーにいるのかを定義する定数を作成します。これまでのところ非常に良い、本当に魔法ではありません。

注意が必要なのは、cronを確実に実行し、誤って間違ったサーバーになっても中止しないようにすることです。このような機能を試してください。

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

これで、cronが他のサーバーで実行されるときに一時的な設定が行われましたが、実行されません。関数do_the_cron_actionはあなたのスクリプトを含みます。

最後のステップは、関数をinitにフックして、サーバーがServerAであるかどうか、および一時が設定されているかどうかを確認することです。

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' );

これでうまくいくはずです。

1
fischi