通常,一些需要经常重复执行的操作,我们可以将它添加到cron任务列表中,来实现自动化。这些操作有些可以通过Bash执行,而有些则必须通过URL方式调用,那么要如何在cron中定时访问这些URL呢?
PHP CLI 方法
此方法最为常见,PHP4.3之后,支持调用PHP命令直接执行本地的.php程序。通常,使用此方法的cron规则格式如下
1 |
*/5 * * * * php /var/www/blog.minirplus.com/cron.php >> /dev/null 2>&1 |
但是,使用PHP CLI有一个明显的缺点,就是没有办法传递Get参数,因为根据官方文档,CLI模式只能以文件方式执行,所以类似于 ?page=2 之类的Get参数是不能使用的,如果使用了,那么该条cron命令也不会执行。所以需要带参数访问的URL通常都不能使用PHP CLI方法。
不过此种方法的优点也很明显,就是不受webServer的超时限制,常用于激活需要执行长时间的批量任务。
Curl 方法
由于PHP CLI不支持传递参数,那么有什么方法可以模拟浏览器访问带参数的指定网址么?答案就是使用Curl。
用Curl改写之前的定时任务,那么cron规则就是下面这样
1 |
*/5 * * * * curl http://blog.minirplus.com/cron.php?page=2 >> /dev/null 2>&1 |
这样一条规则执行的时候就相当于在浏览器中直接访问了该地址,可以看出来,使用Curl的话,不但可以访问本地的网址,还可以定时访问任意外网地址,
另外,如果只需要激活程序而不关心页面的输出结果,那么可以使用curl的 --head 参数,只获取该网址的头部信息,减小网络带宽的占用。
1 |
*/5 * * * * curl --head http://blog.minirplus.com/cron.php?page=2 >> /dev/null 2>&1 |
Wget 方法
wget方法比较特殊,因为它的本意是用做下载的,而这里也可以使用它的访问指定地址的功能,来达到激活的作用
1 |
*/5 * * * * wget http://blog.minirplus.com/cron.php?page=2 >> /dev/null 2>&1 |
同样wget也可以只获取目标的文件头信息,使用的参数是 --spider
1 |
*/5 * * * * wget --spider http://blog.minirplus.com/cron.php?page=2 >> /dev/null 2>&1 |
Know more
PHP CLI其实是可以传递参数的,不过是通过类似于Bash的参数传递方式
使用方法是在文件名称后面空格然后分别输入需要传递的参数,例如
1 |
php script.php arg1 arg2 arg3 |
之后这些参数可以在程序内通过调用 $argv 变量数组来访问对应参数,和通过调用 $argc 变量获得传递参数的数量。
Via:官方文档
使用which查找程序绝对路径
cron默认情况下可以自动识别出在/usr/bin下的程序,如果cron无法识别,可以用which命令查找并更改为绝对地址
1 2 3 4 5 |
root@vps:~# which php /usr/bin/php root@vps:~# which curl /usr/bin/curl root@vps:~# |
cron的时间设置
1 2 3 4 5 6 7 |
# +---------------- minute (0 - 59) # | +------------- hour (0 - 23) # | | +---------- day of month (1 - 31) # | | | +------- month (1 - 12) # | | | | +---- day of week (0 - 6) (Sunday=0) # | | | | | * * * * * command to be executed |
> /dev/null 2>&1的含义
1 2 3 4 5 6 7 8 9 |
/dev/null :代表空设备文件 > :代表重定向到哪里,例如:echo "123" > /home/123.txt 1 :表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null" 2 :表示stderr标准错误 & :表示等同于的意思,2>&1,表示2的输出重定向等同于1 1 > /dev/null 2>&1 语句含义: 1 > /dev/null : 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。 2>&1 :接着,标准错误输出重定向(等同于)标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。 |
There are no comments yet