2011-03-13 59 views
21

首先,我需要了解Magento cron的工作原理。如何使用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工作而不用等很長時間?

回答

54

Magento的cron入口點是Magento根目錄下的cron.php腳本。你需要設置一個OS crontab條目來打這個腳本,你似乎已經完成了。

cron的工作原理

每當cron.php腳本被擊中三件事情發生的時間:

  • 附表:Magento的解析合併​​3210文件<config><crontab>...</crontab></config>jobs條目,閱讀他們的cron_expr元素詳細瞭解他們應該多久運行一次。然後,Magento會使用應該在將來執行的作業填充cron時間表,並附上應該在何時運行的時間戳。 Magento做到這一點的未來範圍可以在管理員中配置。
  • 執行:Magento讀取需要執行的作業的cron調度表,以及應該已經執行的作業,即過去的時間戳,還沒有過期的作業。到期限制也是管理員可配置的參數。
  • 清理:Magento通過日程表刪除已完成或錯過(由於截止日期)的作業。

重複運行?

您提出了一個有趣的觀點。如果您在Magento中安排10分鐘的cron,會發生什麼情況,但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 :)

+4

+1爲徹底。這裏非常好(和準確)的信息。 – shaune 2011-03-14 20:37:54

+2

另請參閱http://www.fabrizio-branca.de/magento-cron-scheduler.html – Alekc 2013-04-08 08:48:47

+0

答案中的鏈接無效。你能否請更新關於如何檢查cron工作與否的答案。 – fresher 2016-05-17 17:05:28

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); 
} 
+2

'file_put_contents('cronlog.txt',date('c'),FILE_APPEND);' – Walf 2014-11-25 02:25:49

+0

當我試着在'cronlog.txt文件中得到'2016年5月17日星期二07:12:03 PM'時,.means是cron在服務器上工作? – fresher 2016-05-17 19:22:26

3

如果你在GNU/Linux可以檢查/var/log/syslog,並通過使用grep濾除cronjobs。要查看運行的所有cronjob列表,請輸入grep 'cron' /var/log/syslog

8

添加這些到cron.php的底部將它寫出來執行cron.php.log和datetime

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); 
} 
3

要測試的cron工作或沒有,你可以簡單地在年底寫Mage::log('cron working', null, 'cron.log'); cron.php文件。

如果cron正在運行,它將在您的基本目錄中創建一個cron.log文件。