Explicación del cron jobs y cron groups
El Cron pertenece a un área independiente llamada crontab. Su entrypoint es el pub/cron.php
. Las diferentes
áreas pueden ser adminhtml, frontend, base, crontab, graphql, webapi_rest y webapi_soap entre otras. El pub/index.php
llama a la aplicación
HTTP (peticiones de HTTP) y pub/cron.php
llama a la aplicación de cron.
El cron de Magento arranca por iniciativa de Linux. Cada minuto se ejecuta una vez el comando bin/magento cron:run
.
Este comando redireccionará el error en formato de output en el terminal y se hará una comprobación del contenido.
Si no está la expresión "Ran jobs by schedule", se escribirá el error en el fichero /var/log/magento.cron.log
# En crontab
* * * * * /usr/bin/php /var/www/html/magento2/bin/magento cron:run 2>&1 | grep -v "Ran jobs by schedule" >> /var/www/html/magento2/var/log/magento.cron.log
El cron general de Magento puede estar desactivado poniendo este código en env.php
o en app/etc/config.php
.
Esta configuración nos permite desactivar el cron por entorno, si la ponemos en env.php
. Por ejemplo en el entorno local o desarrollo.
'cron' => [
'enabled' => 0
]
Para más info, consultar el código en el enlace \Magento\Cron\Console\Command\CronCommand::execute
/**
* Runs cron jobs if cron is not disabled in Magento configurations
*
* {@inheritdoc}
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
if (!$this->deploymentConfig->get('cron/enabled', 1)) {
$output->writeln('<info>' . 'Cron is disabled. Jobs were not run.' . '</info>');
return;
}
Los cron jobs se configuran en el fichero etc/crontab.xml
. Cada job pertenece a un grupo de jobs y
tiene un intervalo de tiempo de espera para su ejecución. El grupo se define en el fichero etc/cron_groups.xml
.
Sus características se pueden definir en el fichero cron_groups.xml
o en el backoffice de Magento Configuration > advanced > system > cron.
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Cron:etc/cron_groups.xsd">
<group id="default">
<schedule_generate_every>15</schedule_generate_every>
<schedule_ahead_for>20</schedule_ahead_for>
<schedule_lifetime>15</schedule_lifetime>
<history_cleanup_every>10</history_cleanup_every>
<history_success_lifetime>60</history_success_lifetime>
<history_failure_lifetime>4320</history_failure_lifetime>
<use_separate_process>0</use_separate_process>
</group>
</config>
Funcionalidad del bin/magento cron:run
La tarea de este comando es añadir cada job de los ficheros crontab.xml
en la tabla cron_schedule
según las características de cada grupo de crones. Por ejemplo, si el cron job pertenece al grupo default,
se recogerán los jobs cada 15 minutos por defecto.
En esta tabla, se concretan la fecha y la hora de ejecución de los diferentes jobs. Luego son eliminados.
Esta tabla sirve para encolar jobs.
+--------------+--------------+------+-----+----------------------+-------------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+----------------------+-------------------+
| schedule_id | int unsigned | NO | PRI | <null> | auto_increment |
| job_code | varchar(255) | NO | MUL | 0 | |
| status | varchar(7) | NO | | pending | |
| messages | text | YES | | <null> | |
| created_at | timestamp | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
| scheduled_at | timestamp | YES | | <null> | |
| executed_at | timestamp | YES | | <null> | |
| finished_at | timestamp | YES | | <null> | |
+--------------+--------------+------+-----+-------------------+----------------------+
El campo messages sirve para registrar errores o información durante la ejecución del cron.
El campo status registra el estado durante la ejecución del cron. El estado missed quiere decir si no se ejecuta el cron job encolado dentro de x minutos, se queda descartada.
- Success: Si hay algún error durante la ejecución, se pone el mensaje del error en el campo messages. Si todo ha ido bien, se cambia al estado "success"
- Missed: si no se ejecuta el cron job encolado dentro de x minutos, se queda descartado.
Configurar el tiempo del cron dinámicamente en el backoffice
Si queremos que el cliente pueda configurar el tiempo de ejecución del cron job en el Backoffice, una de las opciones es la siguiente:
- Crear una opción configurable en el Backoffice
- Tomar el valor del config_core_data mediante el config_path dentro de la etiqueta job del fichero
crontab.xml
# Ejemplo: app/code/Magento/ProductAlert/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="catalog_product_alert" instance="Magento\ProductAlert\Model\Observer" method="process">
<config_path>crontab/default/jobs/catalog_product_alert/schedule/cron_expr</config_path>
</job>
</group>
</config>
# la tabla En core_config_data
+-----------+---------+----------+---------------------------------------------------------------+-----------+---------------------+
| config_id | scope | scope_id | path | value | updated_at |
+-----------+---------+----------+---------------------------------------------------------------+-----------+---------------------+
| 270 | default | 0 | crontab/default/jobs/catalog_product_alert/schedule/cron_expr | 0 0 * * * | 2021-07-06 14:23:40 |
+-----------+---------+----------+---------------------------------------------------------------+-----------+---------------------+
Lista de crones disponibles de Magento.
# Ejecutar el comando: php n98-magerun2.phar sys:cron:list
Cronjob List
+-------------------------------------------------------------------------+-----------+------+------+---+---+----+
| Job | Group | m | h | D | M | WD |
+-------------------------------------------------------------------------+-----------+------+------+---+---+----+
| aggregate_sales_report_bestsellers_data | default | 0 | 0 | * | * | * |
| aggregate_sales_report_coupons_data | default | 0 | 0 | * | * | * |
| aggregate_sales_report_invoiced_data | default | 0 | 0 | * | * | * |
| aggregate_sales_report_order_data | default | 0 | 0 | * | * | * |
| aggregate_sales_report_refunded_data | default | 0 | 0 | * | * | * |
| aggregate_sales_report_shipment_data | default | 0 | 0 | * | * | * |
| aggregate_sales_report_tax_data | default | 0 | 0 | * | * | * |
| analytics_collect_data | default | 00 | 02 | * | * | * |
| backend_clean_cache | default | 30 | 2 | * | * | * |
| braintree_credit_price | default | 0 | 0 | * | * | * |
| bulk_cleanup | default | * | * | * | * | * |
| bulk_mark_incomplete_operations_as_failed | default | */10 | * | * | * | * |
| captcha_delete_expired_images | default | */10 | * | * | * | * |
| captcha_delete_old_attempts | default | */30 | * | * | * | * |
| catalog_index_refresh_price | default | 0 | * | * | * | * |
| catalog_product_alert | default | 0 | 0 | * | * | * |
| catalog_product_attribute_value_synchronize | default | */5 | * | * | * | * |
| catalog_product_flat_indexer_store_cleanup | default | 0 | 0 | * | * | * |
| catalog_product_frontend_actions_flush | default | * | * | * | * | * |
| catalog_product_outdated_price_values_cleanup | default | * | * | * | * | * |
| catalogrule_apply_all | default | 0 | 1 | * | * | * |
| consumers_runner | consumers | * | * | * | * | * |
| currency_rates_update | default | - | - | - | - | - |
| expired_tokens_cleanup | default | 0 | * | * | * | * |
| indexer_clean_all_changelogs | index | 0 | * | * | * | * |
| indexer_reindex_all_invalid | index | * | * | * | * | * |
| indexer_update_all_views | index | * | * | * | * | * |
| messagequeue_clean_outdated_locks | default | 0 | * | * | * | * |
| mysqlmq_clean_messages | default | 30 | 6,15 | * | * | * |
| newsletter_send_all | default | */5 | * | * | * | * |
| outdated_authentication_failures_cleanup | default | * | * | * | * | * |
| paypal_fetch_settlement_reports | default | - | - | - | - | - |
| persistent_clear_expired | default | 0 | 0 | * | * | * |
| sales_clean_orders | default | 0 | * | * | * | * |
| sales_clean_quotes | default | 0 | 0 | * | * | * |
| sales_grid_order_async_insert | default | * | * | * | * | * |
| sales_grid_order_creditmemo_async_insert | default | * | * | * | * | * |
| sales_grid_order_invoice_async_insert | default | * | * | * | * | * |
| sales_grid_order_shipment_async_insert | default | * | * | * | * | * |
| sales_send_order_creditmemo_emails | default | * | * | * | * | * |
| sales_send_order_emails | default | * | * | * | * | * |
| sales_send_order_invoice_emails | default | * | * | * | * | * |
| sales_send_order_shipment_emails | default | * | * | * | * | * |
| security_clean_admin_expired_sessions | default | 0 | 0 | * | * | * |
| security_clean_password_reset_request_event_records | default | 0 | 0 | * | * | * |
| security_deactivate_expired_users | default | 0 | * | * | * | * |
| sitemap_generate | default | 0 | 0 | * | * | * |
| system_backup | default | - | - | - | - | - |
| visitor_clean | default | 0 | 0 | * | * | * |
+-------------------------------------------------------------------------+-----------+------+------+---+---+----+