如何使用Magento测试cron?

2022-08-30 19:26:57

首先,我需要了解Magento cron是如何工作的。

我知道cron如何在linux上工作,使用.
我知道我需要设置Magento的cron.php定期运行crontab -e

但是当我在magento配置文件中定义cron时,它们如何匹配它们应该运行?

因为如果设置我的cron.php每15分钟运行一次(),例如我有一个Magento cron。0,15,30,45 * * * *<schedule><cron_expr>10 * * * *</cron_expr></schedule>

它将如何匹配/工作?

顺便说一句,我如何在不等待很长时间的情况下测试我的cron是否正常工作?


答案 1

Magento 的 cron 入口点是 Magento 根中的脚本。您需要设置一个操作系统 crontab 条目,点击此脚本,您似乎已经这样做了。cron.php

cron 的工作原理

每次脚本被击中时,都会发生三件事:cron.php

  • 计划:Magento 分析条目的合并文件,读取其元素以获取有关应运行频率的详细信息。然后,Magento 使用将来应执行的作业以及应运行这些作业的时间戳填充 cron 计划表。Magento将来执行此操作的范围可以在管理员中配置。config.xml<config><crontab>...</crontab></config>jobscron_expr
  • 执行:Magento 读取 cron 计划表,查找此时需要执行的作业以及应该已经执行的作业,即过去时间戳尚未过期的作业。到期限制也是可在管理员中配置的参数。
  • 清理:Magento 会浏览计划表,删除已完成或错过的作业(由于截止时间)。

重复运行?

你提出了一个有趣的观点。如果您在Magento中安排了10分钟的cron,但只保证每15分钟被击中一次,会发生什么情况。在某些情况下,Magento似乎会运行您的Magento作业两次:cron.php

  • HH:00 -> HH:50 和 HH:00
  • HH:15 -> HH:10
  • HH:30 -> HH:20 和 HH:30
  • HH:45 -> HH:40

我只阅读了代码,这就是似乎发生的事情。当然,找出答案的最好方法是运行它并找出答案。如果您想避免此问题,在大多数情况下,请将执行频率增加到每5分钟一次,这就是我们所做的。cron.php

测试代码

如果要测试 cron 是否确实在不等待 age 的情况下工作,请将 设置为每分钟执行一次,或者清除 cron 计划表,然后按两次(一次生成计划,再次运行作业)。cron_exprcron.php

如果只想测试模型是否正常工作,可以设置一个测试脚本(在 https://www.nicksays.co.uk/testing-magento-modules 中概述),然后运行该脚本。

您的问题提示了一篇博客文章:https://www.nicksays.co.uk/dissecting-the-magento-cron-system:)


答案 2

关于你问题的后半部分...如何判断它是否正在运行。

这是我做的。我在cron.php文件的末尾添加了以下代码。每次调用 cron.php 文件时,这将更新一个名为“cronlog.txt”的简单日志。

因此,如果我对cron运行有疑问,我可以浏览该文件,并查看cron.php文件运行的最后日期和时间。

try {
   $myFile = "cronlog.txt";
   $fh = fopen($myFile, 'w');
   $stringData = date('l jS \of F Y h:i:s A');
   fwrite($fh, $stringData);
   fclose($fh);
} catch (Exception $e) {
   Mage::printException($e);
}

推荐