php中定时计划任务的实现原理


Posted in PHP onJanuary 08, 2013

根据php手册简单介绍一些相关的知识:

1.连接处理:

在 PHP 内部,系统维护着连接状态,其状态有三种可能的情况:

0 - NORMAL(正常)
1 - ABORTED(异常退出)
2 - TIMEOUT(超时)

当 PHP 脚本正常地运行 NORMAL 状态时,连接为有效。当远程客户端中断连接时,ABORTED 状态的标记将会被打开。远程客户端连接的中断通常是由用户点击 STOP 按钮导致的。当连接时间超过 PHP 的时限时,TIMEOUT 状态的标记将被打开。

可以决定脚本是否需要在客户端中断连接时退出。有时候让脚本完整地运行会带来很多方便,即使没有远程浏览器接受脚本的输出。默认的情况是当远程客户端连接中断时脚本将会退出。该处理过程可由 php.ini 的 ignore_user_abort 或由 Apache .conf 设置中对应的"php_value ignore_user_abort"以及 ignore_user_abort() 函数来控制。如果没有告诉 PHP 忽略用户的中断,脚本将会被中断,除非通过 register_shutdown_function() 设置了关闭触发函数。通过该关闭触发函数,当远程用户点击 STOP 按钮后,脚本再次尝试输出数据时,PHP 将会检测到连接已被中断,并调用关闭触发函数。

脚本也有可能被内置的脚本计时器中断。默认的超时限制为 30 秒。这个值可以通过设置 php.ini 的 max_execution_time 或 Apache .conf 设置中对应的"php_value max_execution_time"参数或者 set_time_limit() 函数来更改。当计数器超时的时候,脚本将会类似于以上连接中断的情况退出,先前被注册过的关闭触发函数也将在这时被执行。在该关闭触发函数中,可以通过调用 connection_status() 函数来检查超时是否导致关闭触发函数被调用。如果超时导致了关闭触发函数的调用,该函数将返回 2。

需要注意的一点是 ABORTED 和 TIMEOUT 状态可以同时有效。这在告诉 PHP 忽略用户的退出操作时是可能的。PHP 将仍然注意用户已经中断了连接但脚本仍然在运行的情况。如果到了运行的时间限制,脚本将被退出,设置过的关闭触发函数也将被执行。在这时会发现函数 connection_status() 返回 3。

2.相关函数:

int ignore_user_abort ( [bool setting] )
This function sets whether a client disconnect should cause a script to be aborted. It will return the previous setting and can be called without an argument to not change the current setting and only return the current setting.

int connection_aborted ( void )
Returns TRUE if client disconnected.

int connection_status ( void )
Returns the connection status bitfield.

为了定时更新某一文件,需要程序自动运行,从网上搜到了两种方法:ignore_user_abort() 和crontab

ignore_user_abort()函数搭配set_time_limit(0)和sleep($interval)即可实现程序自动运行更新,下面是一个实例

ignore_user_abort(); //即使Client断开(如关掉浏览器),PHP脚本也可以继续执行. 
set_time_limit(0); // 执行时间为无限制,php默认的执行时间是30秒,通过set_time_limit(0)可以让程序无限制的执行下去 
$interval=60*5; // 每隔5分钟运行 
do{ 
$fp = fopen('test.txt','a'); 
fwrite($fp,'test'); 
fclose($fp); 
sleep($interval); // 等待5分钟 
}while(true);

只要运行上面的页面,然后关掉,程序就会一直运行下去。

Linux 下有种更简单的方法,就是crontab命令

crontab命令的功能是在一定的时间间隔调度一些命令的执行。
crontab 使用方法: crontab [ -e | -l | -r ] 文件名 -e:编辑任务 -l:显示任务信息 -r:删除定时执行任务信息

crontab的格式:
* * * * * Command
分 时 日 月 星期 要运行的命令

crontab的例子:

*/5 * * * * lynx https://3water.com
每5分钟访问一次 3water.com

0 8 * * * lynx https://3water.com
每天早上8点访问 3water.com

0 10 6 * 1-5 lynx https://3water.com
每个月的6号和每个礼拜的星期一到星期五的早上10点访问 3water.com

0 5 7 8 * lynx https://3water.com
8月7日早上5点访问 3water.com

上面几个特殊的意思:
"*"代表所有的取值范围内的数字,"/"代表每的意思,"*/5"表示每5个单位,"-"代表从某个数字到某个数字,","分开几个离散的数字。

PHP 相关文章推荐
为php4加入动态flash文件的生成的支持
Oct 09 PHP
php中对xml读取的相关函数的介绍一
Jun 05 PHP
php setcookie(name, value, expires, path, domain, secure) 参数详解
Jun 28 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十五)
Jun 30 PHP
php用户注册时常用的检验函数实例总结
Dec 22 PHP
四个常见html网页乱码问题及解决办法
Sep 08 PHP
PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法
Jan 04 PHP
php使用timthumb生成缩略图的方法
Jan 22 PHP
完美解决phpexcel导出到xls文件出现乱码的问题
Oct 29 PHP
PHP利用Cookie设置用户30分钟未操作自动退出功能
Jul 03 PHP
Thinkphp5+uploadify实现的文件上传功能示例
May 26 PHP
thinkPHP5使用Rabc实现权限管理
Aug 28 PHP
整理的一些实用WordPress后台MySQL操作命令
Jan 07 #PHP
PHP中设置时区,记录日志文件的实现代码
Jan 07 #PHP
PHP基础教程(php入门基础教程)一些code代码
Jan 06 #PHP
将博客园(cnblogs.com)数据导入到wordpress的代码
Jan 06 #PHP
PHP表单递交控件名称含有点号(.)会被转化为下划线(_)的处理方法
Jan 06 #PHP
Fine Uploader文件上传组件应用介绍
Jan 06 #PHP
PDO版本问题 Invalid parameter number: no parameters were bound
Jan 06 #PHP
You might like
PHP过滤★等特殊符号的正则
2014/01/27 PHP
详解php的socket通信
2015/08/11 PHP
yii2项目实战之restful api授权验证详解
2017/05/20 PHP
PHP注释语法规范与命名规范详解篇
2018/01/21 PHP
PHP sdk实现在线打包代码示例
2020/12/09 PHP
可以支持多中格式的JS键盘
2007/05/02 Javascript
Extjs学习笔记之一 初识Extjs之MessageBox
2010/01/07 Javascript
js获取input标签的输入值实现代码
2013/08/05 Javascript
jquery html动态生成select标签出问题的解决方法
2013/11/20 Javascript
一个简单的动态加载js和css的jquery代码
2014/09/01 Javascript
JavaScript中使用document.write向页面输出内容实例
2014/10/16 Javascript
分享javascript实现的冒泡排序代码并优化
2016/06/05 Javascript
jQuery为DOM动态追加事件的方法
2017/02/16 Javascript
微信小程序左滑删除效果的实现代码
2017/02/20 Javascript
js字符串与Unicode编码互相转换
2017/05/17 Javascript
JS实现根据数组对象的某一属性排序操作示例
2019/01/14 Javascript
微信小程序云开发之使用云数据库
2019/05/17 Javascript
JavaScript模块管理的简单实现方式详解
2019/06/15 Javascript
如何在Vue中抽离接口配置文件
2019/10/31 Javascript
js实现小球在页面规定的区域运动
2020/06/16 Javascript
Python 学习笔记
2008/12/27 Python
使用Python中的线程进行网络编程的入门教程
2015/04/15 Python
Python堆排序原理与实现方法详解
2018/05/11 Python
python清除字符串中间空格的实例讲解
2018/05/11 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
2019/04/09 Python
Python Selenium安装及环境配置的实现
2020/03/17 Python
运动鞋中的劳斯莱斯:索康尼(SAUCONY)
2017/08/09 全球购物
Lookfantastic西班牙官网:英国知名美妆购物网站
2018/06/13 全球购物
应用心理学个人的求职信
2013/12/08 职场文书
学生自我鉴定
2013/12/18 职场文书
《最大的“书”》教学反思
2014/02/14 职场文书
2014年质检员工作总结
2014/11/18 职场文书
2014年质量工作总结
2014/11/22 职场文书
药品销售内勤岗位职责
2015/04/13 职场文书
2015年质检工作总结
2015/05/04 职场文书
留学文书中的个人陈述,应该注意哪些问题?
2019/08/23 职场文书