Cron job的时间格式 :* * * * * 分别对应 分、小时、日、月、星期
所以 */5 * * * * 表示5分钟
计划任务(cron job)是Magento系统中一个很有用甚至可以说必须使用的功能,而最近在网上跟人聊天发现很多Magento的使用者不知道这个功能或者知道却认为可有可无,我在这里建议各位Magento的使用者,把这个功能使用起来吧。
在之前关于Newsletter的那篇博文我有讲到,要使新闻能按设定的时间自动发送,就必须设置好计划任务(cron job)。计划任务(cron job)简单的来说就是在系统中每隔一段时间来重复操作一件事,比如每隔多少时间清理日志,比如每天提交Sitemap给google等等。
而要设置计划任务(cron job),需要在网站运行的服务器(以linux为例)写一段脚本来定时调用网站根目录下的cron.php文件。下面是我自己使用的服务器的设置方式:
1. crontab */5 * * * * /usr/bin/php -f /home/yourdomainname/public_html/cron.php
当然,首先你的服务器得支持cron job你才能使用crontab 这个命令,设置完的效果是服务器每隔5分钟运行一次你的网站根目录下的cron.php文件,cron.php运行时会去检查计划任务时间表中哪些任务的预定时间已经到了,如果到了就立即执行预定的任务,比如提交sitemap,并同时根据各个任务的配置文件或预先设定的任务(特指newsletter)生成新的计划任务时间表。储存这些数据的是数据库中的cron_schedule表,进这个表你会看到一个计划任务的列表
要让某个功能按时运行需要在对应的config.xml中设置计划任务,指定要运行的某个类的某个方法,同样以google sitemap为例
1.
2.
3.
4.
5. sitemap/observer::scheduledGenerateSitemaps
6.
7.
8.
9.
你可以在Sitemap/Model/Observer.php文件中找到scheduledGenerateSitemaps这个方法,这个方法的作用就是向google提交sitemap。同理当你自己的模块有需要定时运行的功能是,可以参照sitemap在自己的config.xml配置要执行的方法。
这里我们再来了解一下 cron job 中的定时器语法
标签中的 5 颗 * 分别代表:
# — M: 分钟 (0 - 59) # | — H:小时 (0 - 23) # | | — D:一个月的哪一天 (1 - 31) # | | | — M: 一年中的哪个月 (1 - 12) # | | | | — 星期几(0 - 7) (星期日 = 0或7) # | | | | | # * * * * * 被执行的命令
# — M: 分钟 (0 - 59)
# | — H:小时 (0 - 23)
# | | — D:一个月的哪一天 (1 - 31)
# | | | — M: 一年中的哪个月 (1 - 12)
# | | | | — 星期几(0 - 7) (星期日 = 0或7)
# | | | | |
# * * * * * 被执行的命令
另外还有几个特殊的符号就是 “*” | “/” | “-” | “,”
星号 (‘*’) 代表任何可能的值。例如,在“小时域” 里的星号等于是“每一个小时”
斜线 (‘/’) 用于表示跳过某些给定的数。例如,“*/3”在小时域中等于“0,3,6,9,12,15,18,21”等被3整除的数
连词符 (‘-‘) 制定值的范围,例如:“1-6”,意思等同于“1,2,3,4,5,6”
逗号 (‘,’) 分开的值,例如:“1,3,4,7,8”
示例:
下面的计划任务会每一分钟执行
* * * * * [command] or */1 * * * * [command] or 0-59 * * * * [command]
* * * * * [command]
or
*/1 * * * * [command]
or
0-59 * * * * [command]
下面的计划任务会在每个小时的0分时运行(就是每小时执行一次)
0 * * * * [command]
0 * * * * [command]
下面依旧是一个每小时运行一次的计划任务。不过是在每个小时的一刻钟时运行的(1:15,2:15 …以此类推)
15 * * * * [command]
15 * * * * [command]
下面的计划任务每天执行一次,在2:30分
30 2 * * * [command]
30 2 * * * [command]
下面的计划任务是在每个月2号的午夜执行(比如:2013-01-02 00:00, 2013-02-02 00:00 …以此类推)
0 0 2 * * [command]
0 0 2 * * [command]
下面的计划任务会在每周一的每个小时0分钟时执行一次
0 * * * 1 [command]
0 * * * 1 [command]
下面的会每小时运行3次,在0分,10分,和20分时
0,10,20 * * * * [command]
0,10,20 * * * * [command]
下面是用除号 / 表示每多少运行一次。本例是每5分钟运行一次
*/5 * * * * [command]
*/5 * * * * [command]
还可以用 – 表示一个范围,如下表示5到10点的每个整点运行一次
0 5-10 * * * [command]
0 5-10 * * * [command]
每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * 1-3 [command]
0 11 4 * 1-3 [command]
晚上11点到早上8点之间每两个小时,早上八点
0 23-7/2,8 * * * [command]
0 23-7/2,8 * * * [command]
另外还有一个特殊的时间关键字“@reboot”,就是每次重启服务器时运行计划任务
@reboot [command]
@reboot [command]
关于 Cron 的一些知识 – 使用PHP解析器
CGI脚本默认是可以执行的,但是php脚本不行,他们需要用php解析器来运行,这就是我们要把php解析器的路径放到php脚本前的原因。
注释使用#字符。例如:
# This cron job does something very important 10 * * * * /usr/bin/php /www/virtual/username/cron.php > /dev/null 2>&1
# This cron job does something very important
10 * * * * /usr/bin/php /www/virtual/username/cron.php > /dev/null 2>&1
设定E-mail
MAILTO="shawn0828@hotmail.com" # This cron job does something very important 10 * * * * /usr/bin/php /www/virtual/username/cron.php > /dev/null 2>&1
MAILTO="shawn0828@hotmail.com"
# This cron job does something very important
10 * * * * /usr/bin/php /www/virtual/username/cron.php > /dev/null 2>&1
有时候php解析器可能在这里”/usr/local/bin/php”。我们可以用下面的命令找到正确的路径:
在终端中输入: which php
系统反馈: /usr/bin/php