get_option関数はキャッシュされますか?


13

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

$options = get_option('my_plugin_options');

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

回答:


25

疑わしいときは、ソースコードを見てください。

を掘り下げると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変数のみ)から値を取得します。ただし、一部のインストールでは、データを他の場所に保存するより高度なオブジェクトキャッシュを使用します。

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

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

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

したがって、元の質問に答えるには:

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

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


2

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

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

クラスを見るWP_Object_Cachewp-includes/cache.phpすべてのプラグインは、パブリックメソッドを呼び出すようにするために、あなたが表示されます、それが可能ですflush()

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


また、自動ロードされないオプションは、最初に検索した後にキャッシュされます。詳細な説明については、私の回答をご覧ください。
EAMann

@EAMann正解、編集しました。
FUXIA
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.