PHP中使用sleep函数实现定时任务实例分享


Posted in PHP onAugust 21, 2014

在某些程序中,有一些特殊的功能需要用到定时执行,如果熟悉Linux的朋友肯定会说这不是容易吗,直接来个计划任务crontab不久实现了吗?这的确是可以实现,但必须是提前知道具体的执行时间,然后才能写到计划任务里去。比如凌晨两点,上午七点,或者每天上午六点三十分等等。

然而有时候,这个时间我们无法预知,而执行时间是程序动态生成的。然后在动态生成的时间后执行某些程序片段,这里就不能用Linux的crontab计划任务了,因为每次执行的时间都是动态生成,而计划任务需要知道一个定死了的时间。既然无法使用计划任务,那么就只能从程序本身寻找实现方法。

在PHP中,有一个sleep函数,大概意思是程序执行遇到sleep函数时暂停N秒后继续往下执行。如sleep(10)意思就是程序自上往下执行,遇到sleep(10)语句后暂停十秒,然后继续往下执行。函数括号内的参数是一个数值,代表暂停时间值,单位秒。请看下面一段代码

<?php
/**
 * sleep函数的用法
 * 琼台博客
 */
// 输出当前程序时间戳
echo time(); // out:1338088780
echo '<br />';
 
// 暂停十秒
sleep(10);
 
// 输出时间戳
echo time(); // out:1338088790

以上程序执行结果是

1338088780

1338088790

我们来解析下执行过程,第一步是打印当前时间戳1338088780,然后暂停十秒,再打印时间戳。由于程序是等待了十秒然后再次打印时间戳,那么就是最后一次的时间戳肯定要比第一次打印的时间戳多十秒钟,结果最后一次的时间戳是1338088790。

以上例子,我们只用了一次sleep函数,页面中可以无限制使用sleep()函数。请看以下代码:

<?php
/**
 * sleep函数的用法
 * 琼台博客
 */
// 输出第一次时间戳
echo time();   // out: 1338088780
echo '<br />';
 
// 暂停十秒
sleep(10);
 
// 输出第二次时间戳
echo time();   // out: 1338088790
echo '<br />';
 
// 暂停二十秒钟
sleep(20);
 
// 输出第三次时间戳
echo time();   // out: 1338088810

以上程序执行结果是

1338088780

1338088790

1338088810

以上代码执行过程:
第一,打印第一次时间戳1338088780
第二,暂停十秒
第三,打印第二次时间戳 1338088790,是第一次时间戳加上十秒后的总和
第四,暂停二十秒
第五,打印第三次时间戳 1338088810,是第二次时间戳1338088790加上二十秒后的总和。

页面中出现两次sleep,第一次是十秒,第二次二十秒。由此得出以上实例总共执行三十秒。页面中多次出现sleep()函数时为累加而不是覆盖前面的代码。

那如何结合sleep定时执行动态生成时间的代码呢?请看以下代码:

<?php
/**
 * sleep函数定时执行动态生成时间段的代码
 * 琼台博客
 */
// 目前时间
echo date('Y-m-d H:i:s'); // out:2012-05-27 14:58:00
echo '<br />';
 
// 动态生成时间 范围在今天下午六点到晚上零点前的任意时间
$datetime = date('Y-m-d').' '.rand('18,23').':'.rand('0,59').':'.rand('0,59'); // 2012-05-27 19:20:00
 
// 算得时间戳
$a = strtotime($datetime);
 
// 算得时间差
$reduce = $a-time();
 
// sleep等待
sleep($reduce);
 
// 执行到时间后执行的代码块
echo date('Y-m-d H:i:s'); // out:2012-05-27 19:20:00

以上代码输出:

2012-05-27 14:58:00

2012-05-27 19:20:00

解析:开始打印当前时间,然后随机算出程序往后执行时间 2012-05-27 19:20:00,由于sleep接受参数是一个以秒为单位的一个数值,所以先把生成的时间转换为时间戳然后再用时间戳减去当前时间戳得出一个时间差,再sleep即可达到程序在随机生成时间执行某些语句达到定时执行效果。这里注意必须算的一个以秒为单位的时间差,如果不能算出秒差就没法使用sleep函数功能。

最后,可能某些童鞋做实例的时候会说怎么我的程序执行出错,提示超时。出现这个问题不要慌,这是PHP默认页面执行时间导致的,在PHP中默认执行页面时间是三十秒钟,这对于一般程序够用了。但如果你要做类似定时执行功能就必须再头部声明设置下执行时间set_time_limit(0)。0是代表不限时,单位是秒。最后整体贴出代码:

<?php
/**
 * sleep函数定时执行动态生成时间段的代码
 * 琼台博客
 */
// 设置页面执行时间,否则会有超时错误提示
set_time_limit(0);
 
// 目前时间
echo date('Y-m-d H:i:s'); // out:2012-05-27 14:58:00
 
// 动态生成时间 范围在今天下午六点到晚上零点前的任意时间
$datetime = date('Y-m-d').' '.rand('18,23').':'.rand('0,59').':'.rand('0,59'); // 2012-05-27 19:20:00
 
// 算得时间戳
$a = strtotime($datetime);
 
// 算得时间差
$reduce = $a-time();
 
// sleep等待
sleep($reduce);
 
// 执行到时间后执行的代码块
echo date('Y-m-d H:i:s'); // out:2012-05-27 19:20:00
PHP 相关文章推荐
php面向对象全攻略 (十一)__toString()用法 克隆对象 __call处理调用错误
Sep 30 PHP
php判断输入不超过mysql的varchar字段的长度范围
Jun 24 PHP
深入解析PHP垃圾回收机制对内存泄露的处理
Jun 14 PHP
php中利用explode函数分割字符串到数组
Feb 08 PHP
Thinkphp模板中截取字符串函数简介
Jun 17 PHP
php中spl_autoload详解
Oct 17 PHP
php将日期格式转换成xx天前的格式
Apr 16 PHP
php微信公众平台示例代码分析(二)
Dec 06 PHP
php生成网页桌面快捷方式
May 05 PHP
ThinkPHP5&amp;5.1框架关联模型分页操作示例
Aug 03 PHP
浅谈laravel 5.6 安装 windows上使用composer的安装过程
Oct 18 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
Feb 21 PHP
PHP实现的多彩标签效果代码分享
Aug 21 #PHP
又一个PHP实现的冒泡排序算法分享
Aug 21 #PHP
PHP中几个可以提高运行效率的代码写法、技巧分享
Aug 21 #PHP
个人写的PHP验证码生成类分享
Aug 21 #PHP
PHP中使用sleep造成mysql读取失败的案例和解决方法
Aug 21 #PHP
从零开始学YII2框架(六)高级应用程序模板
Aug 20 #PHP
ThinkPHP登录功能的实现方法
Aug 20 #PHP
You might like
提升PHP执行速度全攻略(下)
2006/10/09 PHP
php中通过smtp发邮件的类,测试通过
2007/01/22 PHP
Laravel 5框架学习之表单验证
2015/04/08 PHP
ThinkPHP项目分组配置方法分析
2016/03/23 PHP
DOM 脚本编程中的兄弟节点
2009/10/31 Javascript
jQuery学习笔记之jQuery选择器的使用
2010/12/22 Javascript
js控制表单操作的常用代码小结
2013/08/15 Javascript
jquery实现带缩略图的全屏图片画廊效果实例
2015/06/25 Javascript
Javascript日期格式化format函数的使用方法
2016/08/30 Javascript
利用JS判断鼠标移入元素的方向
2016/12/11 Javascript
微信小程序 开发之滑块视图容器(swiper)详解及实例代码
2017/02/22 Javascript
node简单实现一个更改头像功能的示例
2017/12/29 Javascript
JS实现json数组排序操作实例分析
2019/10/28 Javascript
[01:00:17]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第二场 1月25日
2021/03/11 DOTA
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
2018/08/22 Python
Python判断以什么结尾以什么开头的实例
2018/10/27 Python
Python Flask框架模板操作实例分析
2019/05/03 Python
flask框架路由常用定义方式总结
2019/07/23 Python
python实现读取excel文件中所有sheet操作示例
2019/08/09 Python
TensorFlow设置日志级别的几种方式小结
2020/02/04 Python
服务器端jupyter notebook映射到本地浏览器的操作
2020/04/14 Python
Django REST Framework 分页(Pagination)详解
2020/11/30 Python
python中pivot()函数基础知识点
2021/01/03 Python
CSS3实现各种图形的示例代码
2016/10/19 HTML / CSS
Tory Burch美国官方网站:美国时尚生活品牌
2016/08/01 全球购物
德国百年厨具品牌WMF美国站:WMF美国
2016/09/12 全球购物
欧洲顶级的童装奢侈品购物网站:Bambini Fashion(面向全球)
2018/04/24 全球购物
L’AGENCE官网:加州女装品牌
2018/06/03 全球购物
小学生演讲稿大全
2014/04/25 职场文书
工作总结与自我评价
2014/09/18 职场文书
2014年扶贫帮困工作总结
2014/12/09 职场文书
2015年少先队活动总结
2015/03/25 职场文书
电影焦裕禄观后感
2015/06/09 职场文书
创业计划书之网络外卖
2019/10/31 职场文书
【2·13】一图读懂中国无线电发展
2022/02/18 无线电
MongoDB支持的索引类型
2022/04/11 MongoDB