了解 Magento 2 的 Cron 功能

了解如何通过 Magento 2 的 cron 架构中的 crontab.xml 文件管理计划任务(cron 作业)。

如果您使用过 Magento 2,您可能知道某些任务是定期安排和执行的。这些计划任务是 Magento cron 功能的一部分。

Magento 中的计划任务工作原理可能并不像您想象的那么简单。在设置和配置 Cron 任务之前,首先了解 M2 中的 Cron 任务工作原理至关重要。我们将介绍 Cron 任务的定义、所有术语和组成部分,以及它们与 Magento 框架的关系和工作原理。

cron、crontab 和 cron job 之间有什么区别?

在我们开始之前,很容易误解主要的基于 cron 的术语,并且不知道应该如何使用这些术语以及它们之间的区别。

cron是一个运行在服务器上并执行计划任务的应用程序守护进程服务。你可以把它想象成一个后台软件应用程序,它根据 crontab 文件运行并执行作业

crontab是一个配置文件,其名称是cron table的缩写。crontab 文件包含一系列按特定时间按定义的计划运行的作业。这些计划以cron 表达式格式定义(例如),您可以从cron guru了解更多关于 cron 表达式信息。* * * * *

cron作业是 crontab 文件中列出的单独计划任务。一个 crontab 文件中可以定义一个或多个 cron 作业。

Cron 如何与 Magento 配合使用?

在普通的 PHP 应用程序中,通常会在一个 crontab 文件中定义多个 cron 任务。每个任务都会按照 cron 表达式中指定的计划执行。

例如,这里有一个包含两个 cron 作业的 crontab 文件:

# Run a PHP script every day at 3:00 AM
0 3 * * * /usr/bin/php /var/www/html/daily_backup.php

# Run another PHP script every 30 minutes
*/30 * * * * /usr/bin/php /var/www/html/check_notifications.php

Magento 的情况略有不同。在一个 crontab 文件中为多个模块定义多个 cron 任务会非常难以管理和维护,因为该文件的管理范围不在 Magento 项目范围内。这意味着它不在版本控制系统内管理,并且难以在多个环境之间进行管理。

因此,对于 Magento 实例,定义了一个 cron 作业,该作业对于所有环境都是相同的,并且读取为以下内容的变体:

* * * * * /usr/local/bin/php /var/www/html/bin/magento cron:run 2>&1 | grep -v "Ran jobs by schedule" >> /var/www/html/var/log/magento.cron.log

上面的命令每分钟bin/magento cron:run执行一次脚本,正如cron 表达式所定义的那样。该命令之后的所有内容实际上都将该命令执行的输出通过管道传输到文件。* * * * */var/log/magento.cron.log

这意味着 Magento 中计划任务的管理和执行完全由 Magentocron:run命令管理。每分钟bin/magento cron:run执行一次,并调用 Magento 原生的 PHP 脚本。如果您是 Magento CLI 新手,可以学习如何在 Magento 中执行 CLI 命令来管理 cron 和其他系统功能。

在 Magento 中定义 cron 任务

有了这种单一 cron 作业架构,Magento 内部实现了自己的 cron 系统。这使得自定义模块能够利用 Magento 的计划任务功能。

Cron 作业是 Magento 框架的重要组成部分。它们确保一切运行顺畅,处理从索引产品到发送客户邮件等所有事务。您还可以利用 Magento 的内部 cron 功能来定义您自己的自定义计划任务。

就像我们可以在 Unix 服务器上定义 crontab 文件一样,我们可以在 Magento 中定义我们自己的 crontab 文件,但按照标准的 Magento 方式……它必须是一个 XML 文件。

crontab.xml是什么

该文件的目的crontab.xml是为每个 cron 作业指定以下详细信息:

  • Job Name cron 作业的标识符,该标识符在 Magento 中的所有其他 cron 作业中必须是唯一的。
  • Schedule cron 作业应运行的频率,在 cron 表达式语法中定义。
  • instance Run Model  cron 作业运行时应执行的类和方法。

该文件位于etc/crontab.xml任何 Magento 模块的文件中,类似于以下内容:

<?xml version="1.0"?>
<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="daily_backup" instance="Vendor\Module\Cron\DailyBackup" method="execute">
            <schedule>0 3 * * *</schedule>
        </job>
        <job name="check_notifications" instance="Vendor\Module\Cron\CheckNotifications" method="execute">
            <schedule>*/30 * * * *</schedule>
        </job>
    </group>
</config>

您会注意到,daily_backupcheck_notifications任务与我们之前看到的示例相同,但这次是 Magento 的 crontab XML 格式。我们只是定义了负责此 cron 任务的类实例以及要执行的相关方法。

Cron组

查看上面的示例以及crontab.xmlMagento 中的任何其他文件,您会注意到组 ID 始终为default。这是用于组织 cron 作业的默认组。

也就是说,您可以定义自己的自定义组名,以便更好地组织您的自定义 cron 作业任务。例如,设置<group id="foo">会将您的 cron 作业放入一个新foo组中。虽然您通常会使用default组,但使用自定义组会更有优势,尤其是在开发过程中,因为 Magento 还允许您使用以下命令按组执行 cron 作业:

bin/magento cron:run --group=foo

行将仅执行与该foo组相关的 cron 作业。

这种方法可以让你在开发过程中专注于自定义的 cron 任务,而无需触发 Magento 中的所有其他 cron 任务。它可以真正节省时间,尤其是在你深入开发和调试代码的时候。

crontab.xml适用于cron_schedule

虽然主cron:run命令每分钟执行一次,但crontab.xml文件中定义的 cron 表达式会接管执行。这些 crontab 文件与 MySQL 数据库表协同工作,cron_schedule以确定 cron 作业上次执行的时间以及下次执行的时间。

数据库cron_schedule

当根据相关文件中定义的配置安排 cron 作业运行时crontab.xml,Magento 会在 MySQL 的数据库表中创建相应的条目cron_schedule。该表跟踪每个 cron 作业实例的执行状态和其他详细信息。

cron_schedule表包含以下列:

  • job_code: cron 作业实例的唯一标识符,如crontab.xml文件job.name属性中所定义。
  • status: cron 作业实例的当前状态(例如,待定、正在运行、成功、错过、错误)。
  • messages特定于 cron 作业实例的信息。
  • created_at:创建 cron 作业实例的时间戳。
  • scheduled_at: cron 作业实例计划运行的时间戳。
  • executed_at: cron 作业实例实际开始运行的时间戳。
  • finish_at: cron 作业实例完成运行的时间戳。

当 Magento cron 进程运行时,它会在cron_schedule表中查找待处理的作业并根据其预定时间执行它们。

重要cron_schedule表格信息

关于表格,有几件重要的事情需要记住cron_schedule

  1. Cron 作业状态:请注意表格status中的相应列cron_schedule。如果您发现“错过”或“错误”状态数量较多,则可能表明您的 Cron 配置或特定 Cron 作业实现存在问题。
  2. Cron 作业性能:监控executed_at时间戳finished_at,确保 Cron 作业及时运行。如果您发现明显的延迟或执行时间过长,则可能表明存在性能瓶颈或资源限制。
  3. 表大小:cron_schedule会随着时间的推移变得非常大,尤其是在配置了许多 cron 作业的情况下。请定期清理表中的旧条目,以防止过度增长并保持最佳运行状态。
  4. Cron 配置:请确保您的服务器的 cron 已正确配置,以运行 Magento cron 进程。如果 cron 设置不正确,crontab.xml文件中定义的任何任务都将无法执行。

总结

总而言之,Magento 2 的 cron 功能是管理平台内计划任务的强大工具。通过了解crontab.xml配置文件和cron_schedule数据库表之间的关系,您可以更有效地创建、监控和排除自定义 cron 作业的故障,从而成为 Magento 开发人员。

以下是一些需要记住的要点:

  • 不要在系统 cron 中定义 cron 作业,而是在适当的crontab.xml文件中使用 Magento 期望您使用的适当语法来定义。
  • 利用 cron 组在开发过程中组织并有选择地运行特定的 cron 作业集。
  • 监控cron_schedule表格是否存在任何异常或性能问题。
  • 定期清理cron_schedule表中的旧条目以保持最佳性能。
  • 确保您的服务器的 cron 已正确配置以执行 Magento 的 cron 进程。

通过遵循这些指南和最佳实践,您可以充分利用 Magento 2 的 cron 功能来自动执行任务、优化性能并确保您的商店顺利运行。

发表评论