【WP】wp-cron.php無効化とcrontab設定で高速化

wp-cron.phpを無効化することでWordPressの高速化を図ることができます。

理由は、アクセスがあるたびにwp-includes/cron.phpでwp-cron.phpを叩く必要があるかどうかを判定しているからです。

もし予約投稿などで変更がある場合はwp-cron.phpをHTTP:80経由で叩きに行きます。

アクセス毎にwp-cron.phpを叩く必要があるかどうかを確認する処理はかなりの無駄なので、これを無効化することでかなり高速化を図ることができます。

具体的な箇所

具体的な処理をしている箇所はこちらになります。

wp-includes/cron.php
...
function wp_cron() {
        // Prevent infinite loops caused by lack of wp-cron.php
        if ( strpos($_SERVER['REQUEST_URI'], '/wp-cron.php') !== false || ( defined('DISABLE_WP_CRON') && DISABLE_WP_CRON ) )
                return;

        if ( false === $crons = _get_cron_array() )
                return;

        $gmt_time = microtime( true );
        $keys = array_keys( $crons );
        if ( isset($keys[0]) && $keys[0] > $gmt_time )
                return;

        $schedules = wp_get_schedules();
        foreach ( $crons as $timestamp => $cronhooks ) {
                if ( $timestamp > $gmt_time ) break;
                foreach ( (array) $cronhooks as $hook => $args ) {
                        if ( isset($schedules[$hook]['callback']) && !call_user_func( $schedules[$hook]['callback'] ) )
                                continue;
                        spawn_cron( $gmt_time );
                        break 2;
                }
        }
}
...

いろんな処理をした上でwp-cron.phpを叩くかどうかの判定を行っており、これがアクセス毎に呼ばれます。

無駄なのでDISABLE_WP_CRONをtrueにすることで無効化にして、crontabでwp-cron.phpを定期的に実行するようにします。
そうすることで、かなりの高速化がなされています。

wp-cron.phpの無効化

wp-config.phpのどこでもいいので以下を追加します。

追加行
define('DISABLE_WP_CRON', 'true');

これでcron.phpのif文のDISABLE_WP_CRONがtrueになり、処理をせず終了するようになります。

crontab

上記の設定でwp-cron.phpは実行されなくなりましたが、このままではwp-cron.phpを使う予約投稿などの機能が使えなくなってしまいます。

なので、crontabに5分毎にwp-cron.phpを実行するように設定する必要があります。

  • crontabを直接いじれない場合はプラグインなどでcronを設定できるものがありますので、そちらを使用してwp-cron.phpを5分毎に実行するように設定してください。
  • phpを直接実行できない場合はwp-cron.phpにアクセスするだけでも実行されますので、HTTP経由(http://URL/wp-cron.php)で実行するように設定してください。
crontab追加行
*/5 * * * * [phpの場所] [wp-cron.phpの場所] > /dev/null 2>&1
phpの場所がわからない場合
which php

wp-cron.phpは基本的にWordPressのホームディレクトリにあります。

以上でwp-cron.phpの無効化に関する高速化は完了です!

設定前と設定後でパフォーマンスを測定してみると面白いかもです!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です