WordPressの更新で”別の更新が現在進行中です。”エラーが出るときにすべき事

「別の更新が現在進行中です」エラーが出る理由

WordPressの更新を行った際に、下記のような”別の更新が現在進行中です。”エラーが出る場合があります。
161230_2


これは、直前にWordPressの更新を行いエラーが出たとき、直後に再実行すると発生するものです。二重で更新処理が行われないようWordPressの内部でロック処理が行われています。

通常であれば、15分放置した後に再実行すれば問題なく更新が行えます。

「別の更新が現在進行中です」ロックを今すぐ解除する方法

直ぐに再実行したい場合で、MySQLのデータベースにアクセスできる場合は下記の手順でこのロックを強制的に解除できます。

まずDBにアクセスし、下記のSQLを実行してみてください。

SELECT * FROM wp_options WHERE option_name LIKE 'core_updater%';


この時、下記のようにデータが出力されれば二重実行防止のロック用データが存在します。

161230_1


このデータを削除するために、下記のSQLを実行します。

DELETE FROM wp_options WHERE option_name LIKE 'core_updater%';



データ削除後に再度WordPressの管理画面から更新を行えば、エラーが表示されずに更新が行えます。



WordPress上におけるロック処理の実装

WordPressのプログラム上、このロック処理は下記のwp-admin/class-wp-updater.phpにあるcreate_lock()で実装されています。

create_lockの呼び元はclass-core-update.phpにあり、第二引数のrelease_timeoutパラメータに”15 * MINUTE_IN_SECONDS”を指定しているので、15分のロック時間が設定されています。

// Lock to prevent multiple Core Updates occurring
$lock = WP_Upgrader::create_lock( 'core_updater', 15 * MINUTE_IN_SECONDS );
if ( ! $lock ) {
    return new WP_Error( 'locked', $this->strings['locked'] );
}



create_lock()自体の実装は以下のような感じです。optionsテーブルに”core_updater.lock”をキーにしてロック用のレコードをinsertしていることが分かります。
ちなみにこのキーはWordPress4.5までは”core_updater.lock”ではなく”core_updater”となってるため、使用しているWordPressのバージョンによってパラメータのoption_nameは異なります。

/**
    * Creates a lock using WordPress options.
    *
    * @since 4.5.0
    * @access public
    * @static
    *
    * @param string $lock_name       The name of this unique lock.
    * @param int    $release_timeout Optional. The duration in seconds to respect an existing lock.
    *                                Default: 1 hour.
    * @return bool False if a lock couldn't be created or if the lock is no longer valid. True otherwise.
    */
public static function create_lock( $lock_name, $release_timeout = null ) {
    global $wpdb;
    if ( ! $release_timeout ) {
        $release_timeout = HOUR_IN_SECONDS;
    }
    $lock_option = $lock_name . '.lock';
 
    // Try to lock.
    $lock_result = $wpdb->query( $wpdb->prepare( "INSERT IGNORE INTO `$wpdb->options` ( `option_name`, `option_value`, `autoload` ) VALUES (%s, %s, 'no') /* LOCK */", $lock_option, time() ) );
 
    if ( ! $lock_result ) {
        $lock_result = get_option( $lock_option );
 
        // If a lock couldn't be created, and there isn't a lock, bail.
        if ( ! $lock_result ) {
            return false;
        }
 
        // Check to see if the lock is still valid. If not, bail.
        if ( $lock_result > ( time() - $release_timeout ) ) {
            return false;
        }
 
        // There must exist an expired lock, clear it and re-gain it.
        WP_Upgrader::release_lock( $lock_name );
 
        return WP_Upgrader::create_lock( $lock_name, $release_timeout );
    }
 
    // Update the lock, as by this point we've definitely got a lock, just need to fire the actions.
    update_option( $lock_option, time() );
 
    return true;
}

関連記事

コメントを残す

メールアドレスが公開されることはありません。