php定时计划任务的实现方法详解


Posted in PHP onJune 06, 2013

我在uchome 中 分析到, uchome是这样做的
1. 把所有的计划任务存放到数据库
2. 每次用户进行操作或打开页面的时候都按排序执行一条计划任务. 也就是轮番判断,时间到了的, 就在用户进程中执行.
uchome的计划任务代码在 ./source/function_cron.php
上面只自己分析uchome代码关于计划任务大概的结果, 抛砖引玉. 希望谁有好的方法拿出来共享.
ignore_user_abort()
我前一段时间彻底研究过计划任务,认为计划任务的思路很多,但最适合Web的还是触发式的,就是类似于DZ和PHPWind的,似乎大多数web应用也都是这么做的,再说几种其他的供参考
1,为了提供稳定的触发,用crontab+wget或者ab提供定时访问
2,nohup + php写守护程序
3,直接用php写个死循环还提供触发,这时需要用缓存或者数据库来协助推出循环,还有必须用sleep或者usleep控制触发频率
4,crontab+php
5,web触发方式,这也有区别,一种是定时触发,一种是定周期触发,DZ和PHPWind都是定时触发,我最后采用的是定周期触发
具体的实现思路 很容易想,就不多说了
自己有主机肯定用crontab来执行命令行PHP
没有只能写在代码中了
用crontab会比较好, 如果用循环的话, 最好也要把循环和具体处理程序分开, 不然内存会一直增加.

今天一不小心在php手册上发现了这个函数-ignore_user_abort,这个函数可以帮助我们实现像linux中的cron一样实现计划任务,下面一起来看下该如何来实现。
首先看下php手册对这个函数的解释
Description

int ignore_user_abort ([ bool $setting ] )
Sets whether a client disconnect should cause a script to be aborted.

也就是说无论客户端是否关闭浏览器,下面的程序都会执行.
再看下其参数
Parameters

setting
If not set, the function will only return the current setting.

这个函数接受一个参数,来决定是否启用ignore_user_abort的功能。
再看其返回值:

Return Values
Returns the previous setting, as a boolean.

这里说返回前一次的设置,并且是bool值得,经过我的测试,这个说法是不对的,返回的明明是int型的,不相信的话大家可以写一个php文件来测试下。
说了这么多了,到底该如何用php的这个函数实现计划任务呢?还跌借助另外一个函数,这个函数是set_time_limit,通过set_time_limit0)可以设置程序的运行时间为无限制,php默认的运行时间是30秒,通过set_time_limit(0)可以让程序无限制的执行下去。在程序执行之前加上ignore_user_abort(1)和set_time_limit(0)即可以了,最终程序该如何写呢?给大家一个例子。

<?php
ignore_user_abort(); // run script in background
set_time_limit(0); // run script forever
$interval=30; // do every 15 minutes…
do{
$fp = fopen(‘text3.txt','a');
fwrite($fp,'test');
fclose($fp);
sleep($interval); // wait 15 minutes
}while(true);
?>

PHP 相关文章推荐
PHP文件读写操作相关函数总结
Nov 18 PHP
PHP程序员常见的40个陋习,你中了几个?
Nov 20 PHP
php下pdo的mysql事务处理用法实例
Dec 27 PHP
PHP贪婪算法解决0-1背包问题实例分析
Mar 23 PHP
详解WordPress中用于合成数组的wp_parse_args()函数
Dec 18 PHP
提交表单后 PHP获取提交内容的实现方法
May 25 PHP
PHP简单预防sql注入的方法
Sep 27 PHP
laravel创建类似ThinPHP中functions.php的全局函数
Nov 26 PHP
PHP写的简单数字验证码实例
May 23 PHP
thinkphp3.2实现在线留言提交验证码功能
Jul 19 PHP
PHP命名空间namespace及use的简单用法分析
Aug 03 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
Apr 02 PHP
PHP使用DES进行加密与解密的方法详解
Jun 06 #PHP
php xml常用函数的集合(比较详细)
Jun 06 #PHP
PHP5函数小全(分享)
Jun 06 #PHP
解析php时间戳与日期的转换
Jun 06 #PHP
基于header的一些常用指令详解
Jun 06 #PHP
深入php 正则表达式的学习探讨
Jun 06 #PHP
深入理解:单一入口、MVC、ORM、CURD、ActiveRecord概念
Jun 06 #PHP
You might like
七款最流行的PHP本地服务器分享
2013/02/19 PHP
PHP中应该避免使用同名变量(拆分临时变量)
2015/04/03 PHP
详解 PHP加密解密字符串函数附源码下载
2015/12/18 PHP
thinkPHP中多维数组的遍历方法
2016/01/09 PHP
PHP Laravel 上传图片、文件等类封装
2017/08/16 PHP
微信公众平台开发教程⑤ 微信扫码支付模式介绍
2019/04/10 PHP
Yii使用DbTarget实现日志功能的示例代码
2020/07/21 PHP
地址栏上的一段语句,改变页面的风格。(教程)
2008/04/02 Javascript
定义select的边框颜色
2008/04/28 Javascript
通过JS自动隐藏手机浏览器的地址栏实现原理与代码
2013/01/02 Javascript
javascript学习笔记(七)Ajax和Http状态码
2014/10/08 Javascript
tuzhu_req.js 实现仿百度图片首页效果
2015/08/11 Javascript
jquery Deferred 快速解决异步回调的问题
2016/04/05 Javascript
JavaScript中数组的22种方法必学(推荐)
2016/07/20 Javascript
67 个节约开发时间的前端开发者的工具、库和资源
2017/09/12 Javascript
浅析JS中回调函数及用法
2018/07/25 Javascript
使用Angular Cli如何创建Angular私有库详解
2019/01/30 Javascript
微信小程序学习笔记之目录结构、基本配置图文详解
2019/03/28 Javascript
jquery 验证用户名是否重复代码实例
2019/05/14 jQuery
Vue之beforeEach非登录不能访问的实现(代码亲测)
2019/07/18 Javascript
Vue使用Clipboard.JS在h5页面中复制内容实例详解
2019/09/03 Javascript
微信小程序绑定手机号获取验证码功能
2019/10/22 Javascript
vue-socket.io接收不到数据问题的解决方法
2020/05/13 Javascript
[05:24]TI9采访——教练
2019/08/24 DOTA
Python与shell的3种交互方式介绍
2015/04/11 Python
python返回昨天日期的方法
2015/05/13 Python
Python判断值是否在list或set中的性能对比分析
2016/04/16 Python
Jupyter中直接显示Matplotlib的图形方法
2018/05/24 Python
深入了解Python iter() 方法的用法
2019/07/11 Python
Python hashlib模块加密过程解析
2019/11/05 Python
使用Python paramiko模块利用多线程实现ssh并发执行操作
2019/12/05 Python
浅析Python requests 模块
2020/10/09 Python
2016反腐倡廉警示教育心得体会
2016/01/13 职场文书
PyTorch 如何自动计算梯度
2021/05/23 Python
Python天气语音播报小助手
2021/09/25 Python
MySQL中LAG()函数和LEAD()函数的使用
2022/08/14 MySQL