如何用Magento测试cron?

Éri*_*icP 21 php testing cron magento

首先,我需要了解Magento cron的工作原理.

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

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

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

它将如何匹配/工作?

顺便问一下,我怎么能测试我的cron是否可以在没有等待很长时间的情况下工作?

Nic*_*ick 54

Magento的cron入口点是cron.phpMagento根目录中的脚本.您需要在此脚本中设置操作系统crontab条目,您似乎已经完成了此操作.

cron是如何工作的

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

  • 时间表:Magento解析合并的config.xml文件以查找<config><crontab>...</crontab></config> jobs条目,阅读其cron_expr元素以了解它们应运行的频率.Magento然后使用应该在将来执行的作业填充cron调度表,以及应该运行它们的时间戳.Magento执行此操作的未来程度可在管理员中进行配置.
  • 执行:Magento读取cron调度表,查找需要在此秒执行的作业以及应该已执行的作业,即过去的时间戳,尚未过期的作业.到期限制也是管理员可配置的参数.
  • 清理:Magento通过计划表删除已完成或未完成的作业(由于截止日期).

重复运行?

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

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

我只阅读了代码,而这似乎就是这样.当然,最好的方法是运行它并找出答案.如果你想避免这个问题,在大多数情况下,然后将cron.php执行频率提高到每5分钟,这就是我们所做的.

测试你的代码

如果你想测试你的cron是否实际工作而没有等待年龄,设置cron_expr每分钟执行一次,或清除你的cron计划表然后点击cron.php两次(一次生成计划,再次运行作业).

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

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

  • +1彻底.这里非常好(和准确)的信息. (5认同)
  • 另请参阅http://www.fabrizio-branca.de/magento-cron-scheduler.html (2认同)

Max*_*ges 8

将这些添加到cron.php的底部将使其在执行时使用datetime写出cron.php.log

try {
    Mage::getConfig()->init()->loadEventObservers('crontab');
    Mage::app()->addEventArea('crontab');
    Mage::dispatchEvent('default');

$log = fopen(__FILE__.'.log', 'a');
fwrite($log, date("Y-m-d H:i:s").PHP_EOL);
fclose($log);
} catch (Exception $e) {
    Mage::printException($e);
}
Run Code Online (Sandbox Code Playgroud)


RTh*_*mas 7

在问题的后半部分......如何判断它是否在运行.

这是我做的事情.我在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);
}
Run Code Online (Sandbox Code Playgroud)

  • `file_put_contents('cronlog.txt',date('c'),FILE_APPEND);` (2认同)