linux实现php定时执行cron任务详解


Posted in PHP onDecember 24, 2013

对于PHP本身并没有一套解决方案来执行定时任务,不过是借助sleep函数完成的。这种方就是要提前做一些配置,如实现过程:

ignore_user_abort();//关掉浏览器,PHP脚本也可以继续执行.
    set_time_limit(0);// 通过set_time_limit(0)可以让程序无限制的执行下去
    $interval=60*30;// 每隔半小时运行
    do{
        //这里是你要执行的代码   
        sleep($interval);// 等待5分钟
    }while(true);

不过关于这种方式我有一些担心性能方面的问题,不过也是个临时的方法。

本人推荐的方式采用脚本来实现,利用OS本身的定时任务机制,windows上场利用bat脚本。不过本人没有在window上尝试过。那我就讲讲在linux中的实现。

如果你的web server是基于linux的,那么可以采用linux下的cron job 来完成。以RedHat5 为例,我们只需要预先要定时执行的逻辑代码。例如demo.php

<?php
echo "Hello";
?>

然后是吧php用shell脚本一封装,在shell脚本中调用demo.php,demo.sh代码如下:

#!/bin/bash
#if you php install to /usr/local/php/
/usr/local/php/bin/php /home/xx-user/demo.php

完成shell脚本的编写之后,确保它有足够的这行权限,例如:/bin/chmod u+x demo.sh.

然后配置linux上的cronjob,cronjob是linux上默认安装的。如果你的任务是需要按小时、天、周、月来执行的话,那么你直接可以将你的demo.sh脚本拷贝到

/etc/cron.hourly 、/etc/cron.daily 、/etc/cron.weekly、/etc/cron.monthly 就ok了,这样就可以完成你的任务了 。如果到某个时间点想移除定时任务,那就从上面这些folder中move到其它地方或者直接删除掉就ok了。

如果你的脚本有特殊的执行时间,例如每个星期的周二,或者是每个月的15号执行。那么你就需要配置属于你自己的cron job.

关于cron的特殊的配置请参考:http://www.pantz.org/software/cron/croninfo.html

这里我就按照每天的上午12点到下午的14点钟之间每2分钟运行一次这个脚本,那么配置如下(例如demo.sh是位于/tmp 目录下):

首先在linux的命令行中执行crontab -e ,然后把规则输入到里面:

*/2 12-14 * * *  /tmp/demo.sh

带输入完成之后按键盘上的“Esc”键,然后输入:wq,编辑页面就退出了。然后你可以用crontab -l 来查看你刚编辑的cron job.

到此时特殊的cron 也就完成了。例如你刚才是用linux下的demo账户来完成上面的步骤,那么还有一个简单的方法就是直接可以编辑/var/spool/cron/demo 这个文件,可以直接

修改你的cron job.  例如 :vi /var/spool/cron/demo

利用OS的方式来管理你的定时任务是很快捷的,而且不用你担心性能的问题,除非你的脚本本身存在一些问题。这样的方式易于维护,可以修改定时执行的计划,也可以轻松的移除和新增其它的定时任务。

PHP 相关文章推荐
phpinfo 系统查看参数函数代码
Jun 05 PHP
PHP错误抑制符(@)导致引用传参失败Bug的分析
May 02 PHP
ThinkPHP 3.2 数据分页代码分享
Oct 14 PHP
php判断两个日期之间相差多少个月份的方法
Jun 18 PHP
PHP定时执行任务实现方法详解(Timer)
Jul 30 PHP
php实现处理输入转义字符的代码
Nov 08 PHP
PHP使用fopen与file_get_contents读取文件实例分享
Mar 04 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
Aug 17 PHP
thinkPHP中volist标签用法示例
Dec 06 PHP
微信公众平台开发教程③ PHP实现微信公众号支付功能图文详解
Apr 10 PHP
Yii2 queue的队列使用详解
Jul 19 PHP
PHP正则之正向预查与反向预查讲解与实例
Apr 06 PHP
生成随机字符串和验证码的类的PHP实例
Dec 24 #PHP
php下载excel无法打开的解决方法
Dec 24 #PHP
php calender(日历)二个版本代码示例(解决2038问题)
Dec 24 #PHP
discuz免激活同步登入代码修改方法(discuz同步登录)
Dec 24 #PHP
phpexcel导入excel数据使用方法实例
Dec 24 #PHP
php生成excel列序号代码实例
Dec 24 #PHP
php jquery 多文件上传简单实例
Dec 23 #PHP
You might like
简单的移动设备检测PHP脚本代码
2011/02/19 PHP
fetchAll()与mysql_fetch_array()的区别详解
2013/06/05 PHP
linux下使用crontab实现定时PHP计划任务失败的原因分析
2014/07/05 PHP
PHP实现抓取迅雷VIP账号的方法
2015/07/30 PHP
教你php如何实现验证码
2016/01/20 PHP
PHP中array_keys和array_unique函数源码的分析
2016/02/26 PHP
javascript实现上传图片前的预览(TX的面试题)
2007/08/20 Javascript
JavaScript中Object和Function的关系小结
2009/09/26 Javascript
跨浏览器开发经验总结(四) 怎么写入剪贴板
2010/05/13 Javascript
非常强大的 jQuery.AsyncBox 弹出对话框插件
2011/08/29 Javascript
js中replace的用法总结
2013/12/27 Javascript
再谈JavaScript异步编程
2016/01/27 Javascript
js调用父框架函数与弹窗调用父页面函数的简单方法
2016/11/01 Javascript
canvas 绘制圆形时钟
2017/02/22 Javascript
详解node.js平台下Express的session与cookie模块包的配置
2017/04/26 Javascript
JS ES6中setTimeout函数的执行上下文示例
2017/04/27 Javascript
webpack打包单页面如何引用的js
2017/06/07 Javascript
Vue引入jquery实现平滑滚动到指定位置
2018/05/09 jQuery
element-ui中Table表格省市区合并单元格的方法实现
2019/08/07 Javascript
layui 解决富文本框form表单提交为空的问题
2019/10/26 Javascript
vuex存储复杂参数(如对象数组等)刷新数据丢失的解决方法
2019/11/05 Javascript
详解关于Vue单元测试的几个坑
2020/04/26 Javascript
在Python中使用成员运算符的示例
2015/05/13 Python
Python 实现简单的电话本功能
2015/08/09 Python
python使用wmi模块获取windows下的系统信息 监控系统
2015/10/27 Python
Python的组合模式与责任链模式编程示例
2016/02/02 Python
python中的常量和变量代码详解
2018/07/25 Python
Python转换时间的图文方法
2019/07/01 Python
基于Python实现大文件分割和命名脚本过程解析
2019/09/29 Python
Python求解正态分布置信区间教程
2019/11/20 Python
来自Ocado的宠物商店:Fetch
2018/07/10 全球购物
优秀员工评优方案
2014/06/13 职场文书
阅兵口号
2014/06/19 职场文书
公司离职证明标准范本
2014/10/05 职场文书
大学生暑期社会实践的个人总结!
2019/07/17 职场文书
教你利用Nginx 服务搭建子域环境提升二维地图加载性能的步骤
2021/09/25 Servers