Magento有一个非常整洁的cron系统,使开发人员可以按定义的时间间隔运行计划的作业,就像大多数Unix系统上的cron服务一样。我在两年多以前写了一篇文章,内容涉及如何使用Magento cron,但是在这篇文章中,我探讨了服务背后的机制。
cron作为Magento模块,是如何使用Magento进行操作的简单示例,这就是为什么我认为它使它成为值得研究的有趣服务的原因。
全部踢开
我们在操作系统的crontab中添加了一个条目,以处理Magento的crontab,例如:*/5 * * * * www-data /usr/bin/php /var/www/magento/cron.php
。我们通常每5分钟启动一次活动,这对于任何一家商店来说都是足够的。
Crontab作为事件
Magento大量使用Event-Observer模式,以允许模块在正常程序执行过程中挂接到关键点或事件。cron服务通过在文件cron.php中定义一个称为crontab的新事件来利用这一点。这使得实际的cron.php脚本非常简洁(实际上只有8行)并且易于扩展,因此,如果另一个模块需要挂接到cron.php脚本的原始加载中,则可以通过此操作同一事件。
基于XML的Cron条目
希望使用cron的模块不会直接挂接到此crontab事件中,否则,它们将在每次我们访问cron.php时都触发其事件,请记住我们现在每5分钟运行一次,否则必须管理自己的抑制参数,例如确保它们仅每天或每3小时运行一次,等等。
相反,他们定义了config.xml(在此进行讨论),用于描述要运行的模型和方法的条目,以及用于定义方法执行频率的标准cron表达式。
管理时间表
默认情况下,在激发crontab事件时执行的方法cron/observer::dispatch
将处理各种config.xml文件中定义的作业的计划和执行。调度功能负责:
- 时间表创建
- 计划清理
- 计划执行
Magento将config.xml转换为数据库中的挂起作业。一旦满足条件,即所需的执行时间现在或过去,并且没有错过最后期限,该作业将被执行,其状态将更新为完成。
Cron实例很容易耗时超过5分钟,而在我们的设置中,这将导致对cron.php脚本的另一次调用。为了避免重复运行,启动作业后,Magento会锁定该作业。
就是这样。一个非常简洁的模块,大部分繁重的工作都由处理cron表达式解析的cron / schedule模型完成。一个很好地使用事件观察器,自定义config.xml
条目和数据库资源的模块的完美示例。