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 相关文章推荐
利用js调用后台php进行数据处理原码
Oct 09 PHP
如何在PHP中使用Oracle数据库(2)
Oct 09 PHP
如何写php程序?
Dec 08 PHP
PHP开发中常用的三个表单验证函数使用小结
Mar 03 PHP
php checkbox 取值详细说明
Aug 19 PHP
对淘宝URL中ID提取的PHP代码
Sep 01 PHP
PHP使用SOAP扩展实现WebService的方法
Apr 01 PHP
php实现基于pdo的事务处理方法示例
Jul 21 PHP
php-msf源码详解
Dec 25 PHP
PHP实现对图片的反色处理功能【测试可用】
Feb 01 PHP
php处理多图上传压缩代码功能
Jun 13 PHP
在Laravel5.6中使用Swoole的协程数据库查询
Jun 15 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 is_file 判断给定文件名是否为一个正常的文件
2010/05/10 PHP
分享PHP header函数使用教程
2013/09/05 PHP
使用PHP破解防盗链图片的一个简单方法
2014/06/07 PHP
PHP中使用json数据格式定义字面量对象的方法
2014/08/20 PHP
PHP、Python和Javascript的装饰器模式对比
2015/02/03 PHP
PHP7安装Redis扩展教程【Linux与Windows平台】
2016/09/30 PHP
Django 标签筛选的实现代码(一对多、多对多)
2018/09/05 PHP
页面只有一个text的时候,回车自动submit的解决方法
2010/08/12 Javascript
JSChart轻量级图形报表工具(内置函数中文参考)
2010/10/11 Javascript
javascript forEach通用循环遍历方法
2010/10/11 Javascript
使用insertAfter()方法在现有元素后添加一个新元素
2014/05/28 Javascript
jQuery提示效果代码分享
2014/11/20 Javascript
Jquery中巧用Ajax的beforeSend方法
2016/01/20 Javascript
JS实现的手机端精简幻灯片效果
2016/09/05 Javascript
jQuery插件FusionWidgets实现的AngularGauge图效果示例【附demo源码】
2017/03/23 jQuery
vue2.0 keep-alive最佳实践
2017/07/06 Javascript
vue移动端裁剪图片结合插件Cropper的使用实例代码
2017/07/10 Javascript
jquery.rotate.js实现可选抽奖次数和中奖内容的转盘抽奖代码
2017/08/23 jQuery
使用Vue-Router 2实现路由功能实例详解
2017/11/14 Javascript
[01:20:38]完美世界DOTA2联赛 GXR vs IO 第一场 11.07
2020/11/09 DOTA
Python 查找list中的某个元素的所有的下标方法
2018/06/27 Python
python matlibplot绘制3D图形
2018/07/02 Python
python中的插值 scipy-interp的实现代码
2018/07/23 Python
对python 命令的-u参数详解
2018/12/03 Python
Python实现的对一个数进行因式分解操作示例
2019/06/27 Python
python issubclass 和 isinstance函数
2019/07/25 Python
python使用gdal对shp读取,新建和更新的实例
2020/03/10 Python
Scrapy爬虫文件批量运行的实现
2020/09/30 Python
python复合条件下的字典排序
2020/12/18 Python
Expedia英国:全球最大的在线旅游公司
2017/09/07 全球购物
恶搞卫生巾广告词
2014/03/18 职场文书
见习期自我鉴定范文
2014/03/19 职场文书
2014房屋登记授权委托书
2014/10/13 职场文书
先进个人主要事迹范文
2015/11/04 职场文书
网络新闻该怎么写?这些写作技巧你都知道吗?
2019/08/26 职场文书
Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高
2021/08/23 MySQL