linux crontab调度脚本
linux下crontab调度命令定时执行PHP脚本 / php文件定时执行
网上随便搜索也N多相关资料了,这里就讲下PHP程序开发人员需处理的问题。先看下面一行:
*/2 20-22 * * * /bin/sh /usr/local/web/worksh/cron_env.sh /usr/local/php/bin/php/usr/local/web/mycrontab.phppara_val1para_val2(注:每个蓝色加粗字母或/前有一个半角空格;另:para_之间无空格,显示问题)
这一行看起很长,可以按5小节处理,一节节理解;
1>:*/220-22***/bin/sh
---------linux系统运行定时器文件的时间(五个*号,中间有空格)和调度命令(/bin/sh)
五个星(*)号分别代表的意义是:分 时 日 月 周 命令
*—分钟,从0到59之间的任何整数
*—小时,从0到23之间的任何整数
*—日期,从1到31之间的任何整数(如果指定了月份,必须是该月份的有效日期)
*—月份,从1到12之间的任何整数(或使用月份的英文简写如jan、feb等等)
*—星期,从0到7之间的任何整数,这里的0或7代表星期日(或使用星期的英文简写如sun、mon等等)
写法:*(星号)表“所有”,/(斜杠)表“每隔”,-(横杠)表“到”,,(英文逗号)表“第”
范例:
010,12***/usr/bin/backup每天10点和12点执行文件备份;
*/220-22***/bin/sh在每天20:00到22:00之间每2分钟执行一次sh命令;
05-11/28*mon,wed/bin/sh每个月的8号和每个礼拜的礼拜一和礼拜三的早上5点到11点每隔二小时执行一次;
2531,10,22**/etc/init.d/apache2restart每月1、10、22日的3:25重启apache;
/bin/sh 调度命令表示要执行的任务(可以使运行linux系统命令,也可以是执行你自行编写的linux脚本命令)
2>:/usr/local/web/worksh/cron_env.sh 调度命令的执行程序路径(本处为linux系统中sh的路径)
3>:/usr/local/php/bin/php 第4小节文件(本处为PHP文件)的执行程序解析文件(或叫编译)
4>:/usr/local/web/mycrontab.php定时器程序文件(你自己站点或应用的文件)路径
5>:para_val1 para_val2程序文件参数值(如web的URL参数一样)(本处为带了para_val1 para_val2二个值)再啰嗦一句:如果PHP里要获取这二个值,可以用$argv[1]获取第一个值,$argv[2]获取第二值;
程序开发人员的工作,稍微大点的公司,都不会让你去做运维的事情,所以,理解了上面这行,定时器就基本OK了,当然,在提交给运维的时候,别忘了告诉运维,你这程序要在哪台服务器上定时执行。
如果你是在大公司,公司服务器环境也是linux,那么下面的扩展知识,你就不用看了!
下面是应付小公司(1、公司服务器为非linux或者说无法跑crontab调度脚本的 2、干脆就是买了代理服务器空间(新网,万网那种几百兆XX空间的),不能设置任何服务器脚本)
方法一:假定时器或叫触发式定时器(本人命名,如有雷同,纯属同一语文老师所教!)
如果,你的内容,更新量不大,也不要非常及时;可以在程序开头,写一个判断,(在txt或数据库中存储一个判断基数,判断时间),根据用户访问的当前时间,如果未更新,就执行XX定时更新文件,反之跳过。
方法二:通过设置ignore_user_abort()
函数的有效期,来实现定时器PHP
脚本的连接执行(不需用户访问站点);
ignore_user_abort()可以实现当客户端关闭后仍然可以执行PHP代码,可保持PHP进程一直在执行,可实现所谓的计划任务功能与持续进程,只需要开启执行脚本,除非 apache等服务器重启或有脚本有输出,该PHP脚本将一直处于执行的状态,初看很实用,不过代价是一个PHP执行脚本的持续进程,开销很大,如果你是买的那种100M空间,很可能会被服务器管理人员关掉或因他们重启appache导致脚本不再执行,所以你应该跟方法一结合使用,到用户访问时,判断这个连接是否正常,如果不正常再次开启;
1> 每隔15分钟循环执行
<?php
ignore_user_abort();
set_time_limit(0);
$interval=60*15;
do{
//执行的业务
}while(true);
?>
自定义实现输出log并跟踪ignore_user_abort()函数的执行结果
| <?php ignore_user_abort ( TRUE ); set_time_limit ( 0 ); $interval = 10; $stop = 1; do { if( $stop == 10 ) break; file_put_contents('ignore.log',' Current Time: '.time().' Stop: '.$stop); $stop++; sleep ( $interval ); } while ( true ); ?> |
打开ignore. log文件,文件内容如下:
Current Time: 1338878338Stop: 9其原理是即使客户端终止脚本,仍然每隔10秒钟执行一次,并打印出当前时间与终止点,这样就可以测试出ignore_user_abort()函数的具体效果。
if( connection_status () != CONNECTION_NORMAL )
判断是否正常连接。