Guía completa para la gestión de índices de Magento 2

Cualquier sitio web de Magento 2 bien poblado con contenido de alta calidad y una gran variedad de productos tiene que funcionar rápido en la interfaz. ¿Por qué no podemos simplemente decir ‘debería’ en lugar de ‘tiene que’ ?

Es mejor ver una vez que escuchar cien veces:

Fuente :(basado en la investigación de HubSpot que indica cómo las conversiones dependen del tiempo de carga de la página).

Por lo tanto, ¿podemos decir que el rendimiento de la velocidad de su interfaz influye en las conversiones? Seguro que podemos.

¿Cuáles son las principales razones por las que su sitio web puede fallar?

  • Archivos JS y CSS no minimizados 68% (ver la solución aquí )
  • Velocidad de carga HTML lenta 43%
  • Archivos JS y CSS sin comprimir 43%
  • Archivos JS y CSS no almacenados en caché 26%

Para ver una lista completa de problemas, use la fuente .

Optimice los archivos JS y CSS, el código HTML y las imágenes con Google Page Speed ​​Optimizer automáticamente. ¡Aumenta tu puntuación en Google PageSpeed ​​Insights ahora mismo!

IR AL OPTIMIZADOR DE VELOCIDAD DE PÁGINA DE GOOGLE

¿Qué tiene que ver esto con la indexación?

La indexación afecta directamente el rendimiento de su escaparate. Sin indexadores, obligaríamos a nuestra tienda a trabajar sobre la marcha. Entonces, siga leyendo para saber qué es indexar en Magento 2, por qué lo necesita, cómo crear un nuevo indexador y administrar el proceso correctamente.

Resumen del artículo [ ocultar ]

  • ¿Qué es la indexación en Magento 2?
  • Magento 2: terminología de indexación
    • ¿Qué es diccionario?
    • ¿Qué es el índice?
    • ¿Qué es el indexador?
  • ¿Por qué necesita indexadores personalizados de Magento 2?
  • ¿Cómo crear un indexador personalizado de Magento 2?
  • ¡Obtenga la guía GRATUITA de 3 pasos con ejemplos para crear un indexador personalizado desde el primer intento!
  • Actualizar al guardar vs. Actualizar por programación
    • Actualizar en modo Guardar
    • Modo Actualizar por programación
  • ¿Cómo configurar el trabajo Cron en Magento 2 para trabajar con indexadores?
  • ¿Cómo administrar los indexadores personalizados de Magento 2 a través de la línea de comandos?
  • Envolver

¿Qué es la indexación en Magento 2?

En pocas palabras, la indexación es la forma en que Magento 2 convierte los datos actualizables (productos, categorías, precios, etc.) para mejorar el rendimiento de la tienda. Cuando actualiza los datos convertidos, necesita una actualización o Magento 2 para volver a indexarse ​​mediante programación o manualmente.

Más específicamente, lea la definición de Magento DevDocs:

Magento tiene una arquitectura muy sofisticada que almacena muchos datos de comerciantes (incluidos datos de catálogo, precios, usuarios, tiendas, etc.) en muchas tablas de bases de datos. Para optimizar el rendimiento del escaparate, Magento acumula datos en tablas especiales utilizando indexadores.

Fuente

¿Cómo se ve en la práctica?

Tomemos un ejemplo de nuestra extensión Magento 2 Product Labels .

Digamos que creó una etiqueta de producto y especificó 4 condiciones para determinar los casos en los que se debe aplicar la etiqueta. En consecuencia, sin indexadores, al cargar una página de producto, Magento 2 tendría que verificar cada etiqueta para verificar que coincida con las condiciones que usted preestableció. Definitivamente, esto llevaría demasiado tiempo, lo que podría aumentar la tasa de carritos abandonados y disminuiría las conversiones en el futuro previsible.

En el caso de la indexación, la información sobre qué etiquetas se deben mostrar en esta o aquella página de producto ya está guardada en tablas teniendo en cuenta todas las condiciones.

En general, si Magento 2 funcionara sin estas tablas especiales con indexadores, el rendimiento se ralentizaría y, como resultado, perdería una parte importante de las conversiones, lo cual es malo.

Ahora profundicemos en la parte técnica.

Magento 2: terminología de indexación

Al exponerlo todo, la terminología de indexación comprende tres términos principales. Ellos son:

  1. Diccionario;
  2. Índice;
  3. e indexador.

¿Qué es diccionario?

El término incluye todos los datos originales ingresados ​​en su sistema. Para simplificar el mantenimiento, estos diccionarios se normalizan , lo que significa que se reestructuran para reducir la redundancia de datos y mejorar la integridad de los datos.

¿Qué es el índice?

El término significa la representación de los datos originales para mejorar la lectura/búsqueda. Pueden incluir resultados de agregaciones, así como diferentes cálculos. Mediante el uso de un algoritmo especial, el contenido de un índice se puede restaurar desde un diccionario.

¿Qué es el indexador?

Sencillamente, el término implica un objeto que crea un índice.

Cuando comprenda por qué necesita indexadores y conozca la terminología de indexación, es hora de codificar un poco. Entonces, la siguiente parte la hemos dedicado a la creación de un indexador personalizado de Magento 2.

¿Por qué necesita indexadores personalizados de Magento 2?

Volviendo a la extensión Magento 2 Product Labels, cuando desarrollamos el módulo llegamos a la conclusión de que necesitamos crear un indexador personalizado para él.

¿Qué nos hizo pensar eso?

Imagínese múltiples etiquetas creadas en numerosas condiciones para una amplia gama de productos .

¿Puede Magento 2 hacer el trabajo analítico (sobre qué etiqueta y qué páginas de productos mostrar) sobre la marcha?

Sí puede.

¿Su escaparate funcionará bien en eso?

Probamos, no lo hará.

Es por eso que decidimos crear un indexador especial y agregamos una configuración al backend llamada ‘Usar índices para un mejor rendimiento’ , que le permite habilitar el proceso de indexación:

Tenga en cuenta que después de la última actualización, la configuración se eliminó y ahora los indexadores se usan de forma predeterminada.

¿Cómo crear un indexador personalizado de Magento 2?

¡Obtenga la guía GRATUITA de 3 pasos con ejemplos para crear un indexador personalizado desde el primer intento!

Sin garantía de spam.

(function() {
if (!window.mc4wp) {
window.mc4wp = {
listeners: [],
forms : {
on: function (event, callback) {
window.mc4wp.listeners.push({
event : event,
callback: callback
});
}
}
}
}
})();

(function() {
mc4wp.forms.on(‘27340.submit’, function(form, event) {
event.preventDefault();

var submitForm = function() {
if(form.element.className.indexOf(‘mc4wp-ajax’) > -1) {
mc4wp.forms.trigger(‘submit’, [form, event]);
} else {
form.element.submit();
}
};
var previousToken = form.element.querySelector(‘input[name=_mc4wp_grecaptcha_token]’);
if (previousToken) {
previousToken.parentElement.removeChild(previousToken);
}

try {
window.grecaptcha
.execute(‘6LcoY6UZAAAAAP7Dqjtr6MPM8yGySn617oAlWVSx’, {action: ‘mc4wp_form_submit’})
.then(function (token) {
var tokenEl = document.createElement(‘input’);
tokenEl.type = ‘hidden’;
tokenEl.value = token;
tokenEl.name = ‘_mc4wp_grecaptcha_token’;
form.element.appendChild(tokenEl);
submitForm();
});
} catch(err) {
submitForm();
throw err;
}
})
})();

Actualizar al guardar vs. Actualizar por programación

Actualizar en modo Guardar

En el modo de indexación, Actualizar al guardar tiene el sentido de iniciar la reindexación de una instancia definida después de que se haya modificado. En nuestro caso (con etiquetas de productos) dependemos de los productos. Esto significa que mientras se cambia un producto concreto de Magento 2, debemos volver a indexar nuestra instancia para este producto mediante programación. Para volver a indexar la instancia mediante programación en Magento 2, debe hacer lo siguiente:

  • Cree un archivo app/code/Amasty/Example/etc/adminhtml/events.xml :

div.embedPastebin { text-align:left; padding: 0; color: #000; margin: 0; font-family: monospace; background: #F7F7F7; border: 1px solid ddd; border-radius:3px; } div.embedPastebin { } div.embedPastebin div.embedFooter { background: #F7F7F7; color: #333; font-size: 100%; padding: 6px 12px; border-bottom: 1px solid #ddd; text-transform:uppercase; } div.embedPastebin div.embedFooter a, div.embedPastebin div.embedFooter a:visited { color: #336699; text-decoration:none; } div.embedPastebin div.embedFooter a:hover { color: red; } .noLines ol { list-style-type: none; padding-left: 0.5em; } .embedPastebin{background-color:#F8F8F8;border:1px solid #ddd;font-size:12px;overflow:auto;margin: 0 0 0 0;padding:0 0 0 0;line-height:21px} .embedPastebin div { line-height:21px; font-family:Consolas, Menlo, Monaco, Lucida Console,’Bitstream Vera Sans Mono’,’Courier’,monospace; } ol { margin:0; padding: 0 0 0 55px} ol li { border:0; margin:0;padding:0; } li.ln-xtra .de1, li.ln-xtra .de2 {background:#F8F8CE;} .embedPastebin ol li.li1 { margin: 0; } .embedPastebin ol li.li2 { margin: 0; }

Datos alojados con ♥ por Pastebin.comDescargar RawVer original
  1. <? versión xml = «1.0» ?>
  2.  
  3. <config xmlns_xsi=»http://www.w3.org/2001/XMLSchema-instance» xsi_noNamespaceSchemaLocation=»urn:magento:framework:Event/etc/events.xsd»>
  4.    <nombre del evento=»catalog_product_save_after»>
  5.        <observador nombre=»reindex_event» instancia=»AmastyExampleModelObserverBackendCatalogProductSaveAfterObserver» />
  6.    </evento>
  7. </config>

  • Crea un archivo app/code/Amasty/Example/Model/Observer/Backend/CatalogProductSaveAfterObserver.php :

div.embedPastebin { text-align:left; padding: 0; color: #000; margin: 0; font-family: monospace; background: #F7F7F7; border: 1px solid ddd; border-radius:3px; } div.embedPastebin { } div.embedPastebin div.embedFooter { background: #F7F7F7; color: #333; font-size: 100%; padding: 6px 12px; border-bottom: 1px solid #ddd; text-transform:uppercase; } div.embedPastebin div.embedFooter a, div.embedPastebin div.embedFooter a:visited { color: #336699; text-decoration:none; } div.embedPastebin div.embedFooter a:hover { color: red; } .noLines ol { list-style-type: none; padding-left: 0.5em; } .embedPastebin{background-color:#F8F8F8;border:1px solid #ddd;font-size:12px;overflow:auto;margin: 0 0 0 0;padding:0 0 0 0;line-height:21px} .embedPastebin div { line-height:21px; font-family:Consolas, Menlo, Monaco, Lucida Console,’Bitstream Vera Sans Mono’,’Courier’,monospace; } ol { margin:0; padding: 0 0 0 55px} ol li { border:0; margin:0;padding:0; } li.ln-xtra .de1, li.ln-xtra .de2 {background:#F8F8CE;} .embedPastebin ol li.li1 { margin: 0; } .embedPastebin ol li.li2 { margin: 0; }

Datos alojados con ♥ por Pastebin.comDescargar RawVer original
  1. <?php
  2.  
  3. espacio de nombres AmastyEjemploModeloObservadorBackend ;
  4.  
  5. use MagentoFrameworkEventObserver ;
  6. use MagentoFrameworkIndexerIndexerRegistry ;
  7. use MagentoFrameworkEventObserverInterface ;
  8.  
  9. clase CatalogProductSaveAfterObserver implementa ObserverInterface
  10. {
  11.    /**
  12.     * @var IndexerRegistry
  13.     */
  14.    privado $indexerRegistry ;
  15.  
  16.     función pública __construct ( IndexerRegistry $indexerRegistry )
  17.    {
  18.        $this -> indexerRegistry = $indexerRegistry ;
  19.    }
  20.  
  21.     ejecución de función pública ( Observador $ observador )
  22.    {
  23.        $producto = $observador -> obtenerEvento ( ) -> obtenerProducto ( ) ;
  24.  
  25.        si ( $producto ) {
  26.            $this -> indexerRegistry -> get ( ‘amasty_example’ ) -> reindexRow ( $producto -> getId ( ) ) ;
  27.        }
  28.    }
  29. }

Al hacerlo, hemos agregado un observador para una acción de guardado del producto.

Después de cambiar un producto, se llamará al indexador y se transferirá la ID del producto actualizado.

Modo Actualizar por programación

Si cambia el modo Actualizar al guardar para Actualizar por programa uno, se leerá el archivo de configuración app/code/Amasty/Example/etc/mview.xml y se crearán disparadores de MySQL. Esto significa que al eliminar, agregar o actualizar filas en las tablas de suscripciones definidas, se agregará la columna entity_id y se escribirá amasty_example_cl en la tabla (se crea automáticamente para el trabajo en el modo Actualizar por programación):

Además, hay un campo version_id (AUTO_INCREMENT) en la tabla amasty_example_cl . El campo se compara con el campo version_id de mview_state para un indexador actual.

Como resultado, en nuestro procesador de
ejecución ($ids) obtendrá solo aquellas instancias que se han cambiado después del lanzamiento anterior de ?rone ( amasty_example_cl.version_id > mview_state.version_id ).

¿Cómo configurar el trabajo Cron en Magento 2 para trabajar con indexadores?

Los principales trabajos de Cron para trabajar con indexadores se definen en el archivo vendor/magento/module-indexer/etc/crontab.xml .

Al iniciar el trabajo de Cron por indexer_reindex_all_invalid (cada minuto), se iniciará executeFull para indexadores no válidos (están marcados en la cuadrícula de indexadores con el estado REINDEX REQUERIDO ). Está destinado a una reindexación completa, es decir, en este caso para todos los indexadores inválidos, se reescribirá la tabla con la información guardada.

Al iniciar el trabajo de Cron por indexer_update_all_views (cada minuto), se iniciarán todos los indexadores que funcionan en el modo Actualizar según programación . Al iniciarlo mediante indexer_clean_all_changelogs (cada hora) , las tablas _cl (en nuestro ejemplo es amasty_example_cl ) los indexadores se eliminarán de las entradas con version_id debajo de la última versión en la tabla mview_state .

Nota : vea cómo reindexar los indexadores de Magento 2 manualmente sin cron .

Todos los trabajos de Cron presentados pertenecen al grupo de índice . El trabajo del grupo de trabajo Cron se puede configurar aquí Tiendas -> Avanzado -> Sistema :

¿Quieres administrar todas las tareas cron en un solo lugar? ¡ Prueba el programador de Cron ! Este módulo le permite realizar un seguimiento de las tareas cron en una línea de tiempo y administrarlas de forma masiva directamente desde su backend. ¡Échale un vistazo!

IR AL PROGRAMA CRON

¿Cómo administrar los indexadores personalizados de Magento 2 a través de la línea de comandos?

Para ver una lista completa de los comandos del indexador en Magento 2, haga clic en el enlace .

Nota: Al ejecutar el  comando bin/magento  indexer:reindex amasty_example , es posible que se encuentre con el error:
‘El índice de ejemplo de Amasty está bloqueado por otro proceso de reindexación. Salto a la comba.’

Puedes resolverlo de dos formas:
#1. O tiene que esperar al final del proceso de reindexación, que ahora se está ejecutando;
#2. o el proceso de reindexación se interrumpió por algún motivo y el significado del estado no se modificó en la tabla, ya que el proceso no finalizó:

Si esto ocurre, puede restablecer el indexador en su Magento 2 mediante el comando bin/magento indexer:reset amasty_example . Cambiará el estado de trabajo a no válido y, mientras se inicia la próxima reindexación, funcionará.

Envolver

Eso es todo por hoy.

Si tiene preguntas o sugerencias, no dude en plantearlas en los comentarios a continuación.

¡Y estad atentos a las nuevas publicaciones técnicas!