Como: Crear un Cron Job en Magento 2
En esta página
Hace algún tiempo necesitaba ejecutar una tarea de forma automática todas las noches para limpiar unos registros antiguos de una tabla personalizada. La herramienta obvia para esto es un cron job, pero si vienes de Magento 1 la sintaxis cambió un poco, así que déjame mostrarte cómo lo configuré.
app/code/Vendor/Module. Si necesitas saber cómo crear un nuevo módulo, te recomiendo que le eches un vistazo a Cómo crear un nuevo módulo para Magento 2.El crontab.xml
Magento lee los jobs de cada módulo desde su archivo etc/crontab.xml, así que eso es lo primero que necesitamos crear.
<?xml version="1.0"?>
<!-- app/code/Vendor/Module/etc/crontab.xml -->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Cron:etc/crontab.xsd">
<group id="default">
<job name="vendor_module_cleanup" instance="Vendor\Module\Cron\Cleanup" method="execute">
<schedule>0 2 * * *</schedule>
</job>
</group>
</config>Hay un par de cosas que vale la pena explicar aquí:
- Los atributos
instanceymethodle dicen a Magento qué clase y qué método ejecutar, en este casoVendor\Module\Cron\Cleanup::execute(). - El
<schedule>usa la expresión cron estándar.0 2 * * *significa todos los días a las 2:00 AM. - El
group idte permite ejecutar tus jobs en un grupo aparte si lo necesitas, pero para la mayoría de los casos el grupodefaultes suficiente.
<schedule> por <config_path>vendor_module/cron/schedule</config_path> y expón ese valor en el system.xml.La clase del Cron
Ahora creamos la clase que referenciamos en el atributo instance. Mantenla ligera, el cron es solo un punto de
entrada, la lógica real debería vivir en un servicio.
<?php
/** app/code/Vendor/Module/Cron/Cleanup.php */
namespace Vendor\Module\Cron;
use Psr\Log\LoggerInterface;
class Cleanup
{
/**
* @var LoggerInterface
*/
private $logger;
/**
* @param LoggerInterface $logger
*/
public function __construct(LoggerInterface $logger)
{
$this->logger = $logger;
}
/**
* @return $this
*/
public function execute()
{
$this->logger->info('Vendor\Module cleanup cron started');
// Tu lógica aquí, por ejemplo borrar registros antiguos, enviar un reporte, calentar una caché...
return $this;
}
}Probándolo
No tienes que esperar hasta las 2 AM para saber si funciona. Puedes ejecutar el grupo manualmente:
bin/magento cron:run --group=defaultLuego revisa var/log/system.log (o tu logger personalizado) y deberías ver el mensaje que registramos.
* * * * * php /ruta/a/magento/bin/magento cron:run. Ejecutar bin/magento cron:install configura esto por ti.Espero que esto ayude.
Si tienes alguna pregunta o conoces una mejor manera de lograr esto, siéntete libre de compartir en los comentarios a continuación.
Related links: