A função get_option está em cache?

13

No meu plug-in, uso o seguinte código para recuperar uma opção do banco de dados:

$options = get_option('my_plugin_options');

Se eu usar isso 10 vezes em várias funções do meu plug-in, o WordPress faz 10 consultas ao banco de dados ou faz apenas 1 chamada ao banco de dados por solicitação HTTP e armazena em cache os resultados?

Ben Miller - Restabelecer Monica
fonte

Respostas:

25

Em caso de dúvida, observe o código fonte.

Ao entrar em get_option(), você verá (abreviado):

 $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 );
    }
}

Primeiro, o WordPress verifica se ele já tem a opção na memória. Por padrão, wp_cache_get()recuperará valores de um armazenamento de dados na memória (geralmente apenas uma variável PHP). Mas algumas instalações usam um cache de objetos mais avançado que armazena os dados em outro local.

Em ambos os casos, wp_cache_get()retornará o valor da opção se o WordPress já souber.

Caso contrário, o WordPress tentará capturá-lo do banco de dados. Se a opção existir no banco de dados, o WordPress armazenará em cache na memória e retornará, tornando as pesquisas subseqüentes mais rápidas.

Se a opção não existe no banco de dados, o WordPress o sinaliza em uma matriz interna "essas opções não existem" para que não tente procurar mais tarde e retorne algum valor padrão.

Portanto, para responder à sua pergunta original:

Se eu usar isso 10 vezes em várias funções do meu plug-in, o WordPress faz 10 consultas ao banco de dados ou faz apenas 1 chamada ao banco de dados por solicitação HTTP e armazena em cache os resultados?

O WordPress fará uma chamada de banco de dados por solicitação HTTP e armazenará em cache os resultados.

EAMann
fonte
2

Sim, está em cache. Veja a fonte da função. Ele chama wp_load_alloptions()em segundo plano, para buscar todas as opções, e essa função adiciona o resultado ao cache:

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

Se você olhar para a classe WP_Object_Cacheem wp-includes/cache.php, você vai ver, é possível para cada plug-in para chamar o método público flush().

Nesse caso, o valor da opção não é mais armazenado em cache e get_option()acionará uma nova pesquisa no banco de dados. Os plug-ins não devem fazer isso, mas para ter certeza de que você não é afetado, não chame o cache diretamente, use sempre apenas get_option().

fuxia
fonte
Além disso, as opções que não são carregadas automaticamente serão armazenadas em cache após a primeira vez que você as procurar. Veja minha resposta para uma descrição completa.
EAMann
@ EAMann Correto, eu editei isso.
fuxia