第七星尘

迁离SAE系列:定时任务篇

一,前言:

新浪云计算平台SAE更改了计费策略后,新的计费策略使得网站运行的成本越来越高,于是很多开发者包括本人都准备把应用和网站迁离SAE平台了。然而SAE平台跟普通PHP环境始终有区别。特别是当你的应用使用到SAE的一些云服务的时候,此时要迁移就必须改动下代码。本人将整理下自己迁离的一些经验,分享出来,希望对需要的人有帮助。

二,需求分析

在进行网站开发的时候,我们可能会需要定时处理一些任务。比如,定时检查长期不登录的用户然后发邮件去鼓励用户登录,定时备份数据库,定时给女朋友好基友发短信等等。SAE有提供CRON服务,可以以http的方式触发你的PHP脚本从而执行定时任务。那么,在普通的PHP环境下,如何做呢?

三、主要思路

我们可以利用linux服务器的crontab来实现定时任务。此外,本文在后面还会介绍一种“定时任务单文件入口”的偏门方法。

四、操作方法

1. linux服务器的crontab

在linux服务器终端输入“crontab -e”,接下来就是进入vi编辑器。按“i”进入插入模式,然后输入定时命令,然后按键盘ESC,然后输入“:wq”保存。
定时命令的格式示例:

*/10 * * * * curl   http://xxx.cn/index.php?c=fee&a=deduct (每10分账执行一次)
*/1 * * * *  /usr/bin/php /var/www/fabuduan/cron/start.php   #每分钟执行一次

以上两条命令,第一条是用HTTP的方式触发定时任务的,第二条则是用命令行的方式触发的。
关于详细的crontab命令格式可参看:http://www.cnblogs.com/peida/archive/2013/01/08/2850483.html

2. 定时任务单文件入口

(1). 什么是单文件入口

所谓单文件入口,指的是linux服务器的crontab只触发一个php脚本文件,这个脚本文件自身再去触发其他更多的定时脚本。单文件入口的好处有:①、不需要每次新增定时命令都需要登录进linux服务器(尤其是像公司管理等对权限管制比较严格的地方)②,全部定时脚本的入口都放在单一入口的话,方便后期的控制和管理

(2). 怎么实现单文件入口

我们新建一个/cron目录,专门用来放置定时脚本。新建一个start.php作为入口文件。以后我们只需要把start.php加入linux的cron,每分钟执行一次就好了。
假设我们需要增加一个定时备份数据库的任务,于每天凌晨执行。则可以这样操作:
在/cron新建目录下backup.php文件,里面写好备份的程序代码(在文件的前面最好加上ignore_user_abort())。
打开start.php文件,增加如下代码:

//晚上定时备份,每晚凌晨4点1分备份
ignore_user_abort();
function curl_execute($url){
    $curlObj = curl_init();    //初始化curl
    curl_setopt($curlObj, CURLOPT_URL, $url);   //设置网址
    curl_setopt($curlObj, CURLOPT_HEADER, 0);         //是否输出返回头信息
    curl_setopt($curlObj, CURLOPT_RETURNTRANSFER, 0);
    curl_setopt($curlObj, CURLOPT_TIMEOUT, 10); //超时间为10秒
    $response = curl_exec($curlObj);   //执行
    curl_close($curlObj);
}
//每晚凌晨4点1分执行备份
if (date("H:i") == '04:01') {
    curl_execute('http://xxcxxx.cn/cron/backup.php');
}

以后,每增加一项定时任务,则新建好相应脚本后,在start.php文件添加curl_execute()任务就好了。此方式为图方便的方法,但面临数据量大或者网络环境差的场合可能会性能差或者不稳定甚至延迟。要保证可靠性,还是请用回crontab

分享到: 更多
码字很辛苦,转载请注明来自第七星尘的技术博客《迁离SAE系列:定时任务篇》

评论