web-dev-qa-db-ja.com

Get_option関数はキャッシュされていますか?

私のプラグインでは、データベースからオプションを取得するために次のコードを使用します。

$options = get_option('my_plugin_options');

プラグインのさまざまな機能でこれを10回使用すると、WordPressはデータベースに対して10回のクエリを実行するのですか、それともHTTPリクエストごとに1回のデータベース呼び出しのみを実行して結果をキャッシュするのですか?

12
Ben Miller

疑問がある場合は、ソースコードを見てください。

get_option()を掘り下げると、(省略形)が表示されます。

 $value = wp_cache_get( $option, 'options' );

if ( false === $value ) {
    $row = $wpdb->get_row( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1", $option ) );

    // Has to be get_row instead of get_var because of funkiness with 0, false, null values
    if ( is_object( $row ) ) {
        $value = $row->option_value;
        wp_cache_add( $option, $value, 'options' );
    } else { // option does not exist, so we must cache its non-existence
        $notoptions[$option] = true;
        wp_cache_set( 'notoptions', $notoptions, 'options' );
        return apply_filters( 'default_option_' . $option, $default );
    }
}

まず、WordPressはすでにメモリにオプションがあるかどうかを確認します。デフォルトでは、wp_cache_get()はインメモリデータストア(通常は単にPHP変数)から値を取得します。しかし、インストールによっては、データを他の場所に格納する、より高度なオブジェクトキャッシュを使用するものがあります。

どちらの場合でも、WordPressがすでにそれを知っている場合、wp_cache_get()はあなたのオプション値を返します。

そうでなければ、WordPressはデータベースからそれを取得しようとします。オプションがDBに存在する場合、WordPressはそれをメモリにキャッシュしてから戻し、それ以降の検索を高速にします。

そのオプションがデータベースに存在しない場合、WordPressはそれを内部の「これらのオプションは存在しない」配列にフラグを立てて、後で調べようとせずに代わりにデフォルト値を返します。

それで、あなたの最初の質問に答えるために:

プラグインのさまざまな機能でこれを10回使用すると、WordPressはデータベースに対して10回のクエリを実行するのですか、それともHTTPリクエストごとに1回のデータベース呼び出しのみを実行して結果をキャッシュするのですか?

WordPressはHTTPリクエストごとに1回データベース呼び出しを行い、結果をキャッシュします。

20
EAMann

はい、それはキャッシュされています。関数のソースを見てください。バックグラウンドでwp_load_alloptions()を呼び出してすべてのオプションを取得し、その関数が結果をキャッシュに追加します。

wp_cache_add( 'alloptions', $alloptions, 'options' );

WP_Object_Cacheのクラスwp-includes/cache.phpを見ると、すべてのプラグインがパブリックメソッドflush()を呼び出すことが可能です。

この場合、オプション値はもうキャッシュされず、get_option()は新しいデータベース検索を引き起こします。プラグインはこれを行うべきではありませんが、あなたが影響を受けていないことを確実にするために、直接キャッシュを呼び出さず、常にget_option()のみを使用してください。

1
fuxia