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中文汉字验证码
Apr 08 PHP
php smarty模版引擎中的缓存应用
Dec 02 PHP
php批量缩放图片的代码[ini参数控制]
Feb 11 PHP
Php图像处理类代码分享
Jan 19 PHP
关于php操作mysql执行数据库查询的一些常用操作汇总
Jun 24 PHP
PHP的变量类型和作用域详解
Mar 12 PHP
php防止伪造数据从地址栏URL提交的方法
Aug 24 PHP
php实现过滤表单提交中html标签的方法
Oct 17 PHP
检测codeigniter脚本消耗内存情况的方法
Mar 21 PHP
thinkphp3.x中变量的获取和过滤方法详解
May 20 PHP
php并发加锁示例
Oct 17 PHP
PHP实现的统计数据功能详解
Dec 06 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
phpMyAdmin链接MySql错误 个人解决方案
2009/12/28 PHP
php Calender(日历)代码分享
2014/01/03 PHP
laravel-admin select框默认选中的方法
2019/10/03 PHP
浅谈Laravel POST,PUT,PATCH 路由的区别
2019/10/15 PHP
PHP 实现缩略图
2021/03/09 PHP
浏览器无法运行JAVA脚本的解决方法
2008/01/09 Javascript
jQuery 开发者应该注意的9个错误
2012/05/03 Javascript
JavaScript代码复用模式实例分析
2012/12/02 Javascript
jquery 循环显示div的示例代码
2013/10/18 Javascript
整理的比较全的event对像在ie与firefox浏览器中的区别
2013/11/25 Javascript
jsPDF生成pdf后在网页展示实例
2014/01/16 Javascript
使用JS+plupload直接批量上传图片到又拍云
2014/12/01 Javascript
jQuery插件expander实现图片翻转特效
2015/05/21 Javascript
jquery实现初次打开有动画效果的网页TAB切换代码
2015/09/06 Javascript
开启Javascript中apply、call、bind的用法之旅模式
2015/10/28 Javascript
JavaScript位置与大小(1)之正确理解和运用与尺寸大小相关的DOM属性
2015/12/26 Javascript
jquery+json实现分页效果
2016/03/07 Javascript
Vuejs第十三篇之组件——杂项
2016/09/09 Javascript
详解Vue2.0配置mint-ui踩过的那些坑
2018/04/23 Javascript
webpack4与babel配合使es6代码可运行于低版本浏览器的方法
2018/10/12 Javascript
Vue项目中使用better-scroll实现一个轮播图自动播放功能
2018/12/03 Javascript
Vue使用vue-draggable 插件在不同列表之间拖拽功能
2020/03/12 Javascript
vant 时间选择器--开始时间和结束时间实例
2020/11/04 Javascript
[03:03]DOTA2校园争霸赛 济南城市决赛欢乐发奖活动
2013/10/21 DOTA
Python List cmp()知识点总结
2019/02/18 Python
pandas删除指定行详解
2019/04/04 Python
Python实现多线程/多进程的TCP服务器
2019/09/03 Python
tensorflow求导和梯度计算实例
2020/01/23 Python
Python调用C语言程序方法解析
2020/07/07 Python
Django websocket原理及功能实现代码
2020/11/14 Python
Python numpy大矩阵运算内存不足如何解决
2020/11/19 Python
德国狗狗用品在线商店:Schecker
2017/03/17 全球购物
对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中
2015/06/22 面试题
厨房领班竞聘演讲稿
2014/04/23 职场文书
2015年全国“爱牙日”宣传活动总结
2015/03/23 职场文书
如何在pycharm中快捷安装pip命令(如pygame)
2021/05/31 Python