get_option () vs get_theme_mod (): ¿Por qué uno es más lento?

14

He estado usando get_theme_mod() por algún tiempo en varios proyectos míos. Decidí aprovechar la API de personalización de temas en WordPress v3.4 una vez que estuviera disponible, ya que sentí que era una herramienta indispensable para el uso de mis clientes.

Después de un tiempo, comencé a notar que mis sitios se sentían un poco más lentos de lo habitual, y el Personalizador, en particular, tardó bastante tiempo en cargar. A través de muchas pruebas y errores durante mi investigación, decidí intentar cambiar el type al registrar mi configuración (es decir, $wp_customize->add_setting() ) de theme_mod a option .

Una vez que hice esto y cambié todas mis llamadas get_theme_mod() a get_option() , noté un aumento muy significativo en la velocidad utilizando la última configuración en lugar de la primera en la interfaz y Especialmente en el personalizador en el backend. He estado buscando a través del núcleo de WordPress en un esfuerzo por tratar de encontrar una respuesta a por qué esto es así, pero parece que no puedo discernir cuál es el problema particular en este escenario.

Cualquier información que la comunidad pueda tener con respecto a get_option() con un rendimiento significativamente más rápido que get_theme_mod() sería muy apreciada.

    
pregunta ntg2 18.07.2014 - 22:06

4 respuestas

18

La respuesta es sí, las funciones de theme_mod serán más lentas, pero no significativamente, y los beneficios superan las diferencias.

Las modificaciones de tema se almacenan como opciones. Así que, en esencia, las funciones theme_mod son envolturas alrededor de las funciones de opciones.

Primero, comprenda que las configuraciones de theme_mod se almacenan como una matriz en una sola opción, con la clave del nombre del tema específico. Entonces, si hago esto:

set_theme_mod('aaa',123);
set_theme_mod('bbb',456);

Entonces, lo que realmente obtengo en la base de datos es una única fila de opciones con el nombre de theme_mods_themename que contiene una matriz serializada con ('aaa' = > 123, 'bbb' = > 456) en ella.

Ahora, get_theme_mod será más lento porque en realidad está haciendo dos llamadas get_option . En primer lugar, obtiene el nombre del tema. Luego, obtiene la opción theme_mods_themename . Así que justo ahí es una pérdida de velocidad del 50%. El resto del trabajo realizado se basa principalmente en los filtros, ya que hay una llamada de filtro adicional, pero a menos que tenga algo en ese filtro, esto es un poco insignificante.

Tenga en cuenta que el sistema de opciones almacena los datos recuperados en el caché de objetos, por lo que no está realizando varias llamadas a la base de datos aquí. Solo el primer uso resulta en un hit de base de datos.

El set_theme_mod será un poco más lento porque hace esas mismas dos llamadas de opciones de obtención, luego hace otra llamada get_option para obtener el nombre del tema nuevamente, y luego hace update_option con el conjunto completo de ahora cambiado. opciones Esto provoca una actualización de la base de datos, y el hecho de que esté enviando muchos más datos puede ser la causa de una desaceleración notable. Actualizar unos pocos bytes es más rápido que actualizar una fila más grande. Pero no tanto como te darías cuenta, por lo general. A menos que tengas un montón de configuraciones ...

Las funciones de modificación de tema probablemente se deban a la optimización en general, sin embargo, sin embargo, aún así debes usarlas en lugar de get_option y demás, porque son temas secundarios.

El problema con el uso de las filas de opciones directamente es que las está usando directamente y está usando nombres de clave específicos para su configuración.

Si tengo un tema llamado "AAA" y hago un tema secundario llamado "BBB" para usar en otro sitio, entonces mi tema "AAA" podría usar una opción llamada "ejemplo". Cuando actualizo un sitio y esta actualiza mi opción, la misma opción ahora se aplicará a mi tema secundario. ¿Y si no quisiera que lo hiciera? ¿Qué sucede si deseo que el tema secundario utilice un conjunto diferente de configuraciones de opciones?

Las modificaciones de tema, al incluir el nombre del tema real (y no un valor codificado) como parte de la clave, aseguran que cada "tema" en el sitio use su propio conjunto de configuraciones. Puedo cambiar de un lado a otro y la configuración no se transfiere entre ellos, permanecen como los establezco. Más simple, más obvio, más intuitivo.

Y si algún cambio central o complemento en el futuro modifica el funcionamiento de theme_mods, automáticamente obtendrá los beneficios de eso sin ningún cambio. Los envoltorios siempre van a ser más lentos, eso es inevitable, es la naturaleza de los envoltorios. Sin embargo, todavía estás escribiendo código PHP, no lenguaje de máquina. Usamos envoltorios como este para simplificar las cosas y la funcionalidad por separado. Los temas no deben saber, o preocuparse, cómo se almacenan sus opciones en la base de datos o cómo funciona la asignación de nombres. Las funciones theme_mod proporcionan una solución más simple y más limpia.

    
respondido por el Otto 21.09.2014 - 19:19
3

get_theme_mod es solo una envoltura alrededor de get_option . En teoría, debido a que es otra capa de abstracción, funcionará más lentamente, pero en la práctica, la diferencia no debe ser lo suficientemente grande como para que un humano la note.

Las diferencias de velocidad reales pueden ser causadas si tienes algún código lento enganchado en los ganchos de theme_mod.

    
respondido por el Mark Kaplun 20.07.2014 - 05:11
0

Entonces, ¿podría haber algo en el Personalizador? Estoy viendo lo mismo que el OP aquí.

Puedo confirmar que con aproximadamente 30 opciones mi tiempo de carga del Personalizador se redujo de alrededor de 3s, a alrededor de .5s al cambiar a get_option sobre get_theme_mod

Llamando a los métodos directamente veo una diferencia de 2 ms.

( enlace )

Es posible que no se note cuando se comparan las API directamente, pero debe haber algo relacionado con la forma en que se utilizan en el Personalizador.

    
respondido por el VykRevler 21.07.2014 - 23:55
0

Puede PRUEBA EL TIEMPO de get_option (100 iteraciones) usando este código (ingrese functions.php o en algún lugar):

add_action('wp','My_Test');
function My_Test(){
    var_dump(microtime(true));
    for ($i=1; $i<100; $i++) { get_option('blogdescription'); }
    var_dump(microtime(true));
    for ($i=1; $i<100; $i++) { get_theme_mod('blogdescription'); }
    var_dump(microtime(true));
    exit;
}   




Otros pensamientos

No sé, si hace una diferencia (tal vez los desarrolladores de Wordpress lo saben mejor), pero pensé que si un sitio web tiene tráfico ALTO, y en cada carga de página, necesita obtener cientos de opciones, y luego, qué pasa si ¿Uniré muchas opciones en un get_option ? de esta manera:

update_option('my_extra_optss',  array(
      'myNAME' => 'George',
      'myAGE'  => 43 ));

entonces:

$x = get_option('my_extra_optss');
$x['myNAME'];
$x['myAGE'];
................

¿Esto hará que un sitio sea un poco más rápido?

    
respondido por el T.Todua 11.07.2015 - 12:14

Lea otras preguntas en las etiquetas