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_Cache에서 wp-includes/cache.php볼 것, 모든 플러그인이 공개 메소드를 호출하는 것이 가능합니다 flush().

이 경우 옵션 값은 더 이상 캐시되지 않으며 get_option()새 데이터베이스 조회를 트리거합니다. 플러그인은이 작업을 수행하지 않아야하지만 영향을받지 않도록 캐시를 직접 호출하지 말고 항상을 사용하십시오 get_option().


또한 자동로드되지 않은 옵션은 처음 찾은 후에 캐시됩니다. 자세한 설명 은 내 답변 을 참조하십시오 .
EAMann 2016 년

@ EAMann 맞습니다. 편집했습니다.
fuxia
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.