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生成静态页面详解
Nov 19 PHP
php 信息采集程序代码
Mar 17 PHP
深入PHP数据加密详解
Jun 18 PHP
php中让上传的文件大小在上传前就受限制的两种解决方法
Jun 24 PHP
PHP二维数组排序的3种方法和自定义函数分享
Apr 09 PHP
php判断GIF图片是否为动画的方法
Sep 04 PHP
destoon实现公司新闻详细页添加评论功能的方法
Jul 15 PHP
php给图片添加文字水印方法汇总
Aug 27 PHP
Zend Studio使用技巧两则
Apr 01 PHP
遍历指定目录,并存储目录内所有文件属性信息的php代码
Oct 28 PHP
PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
Dec 08 PHP
laravel配置Redis多个库的实现方法
Apr 10 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
Linux下创建nginx脚本-start、stop、reload…
2014/08/03 PHP
PHP中shuffle数组值随便排序函数用法
2014/11/21 PHP
分享五个PHP7性能优化提升技巧
2015/12/07 PHP
Laravel 5.3 学习笔记之 配置
2016/08/28 PHP
利用Homestead快速运行一个Laravel项目的方法详解
2017/11/14 PHP
php闭包中使用use声明变量的作用域实例分析
2018/08/09 PHP
PHP如何使用array_unshift()在数组开头插入元素
2020/09/01 PHP
关于JavaScript的gzip静态压缩方法
2007/01/05 Javascript
JS IE和FF兼容性问题汇总
2009/02/09 Javascript
兼容主流浏览器的jQuery+CSS 实现遮罩层的简单代码
2014/10/14 Javascript
全面解析Angular中$Apply()及$Digest()的区别
2016/08/04 Javascript
IE8兼容Jquery.validate.js的问题
2016/12/01 Javascript
javascript实现延时显示提示框效果
2017/06/01 Javascript
详解angularJS+Ionic移动端图片上传的解决办法
2017/09/13 Javascript
用vue封装插件并发布到npm的方法步骤
2017/10/18 Javascript
Vue.set()实现数据动态响应的方法
2018/02/07 Javascript
小程序文字跑马灯效果
2018/12/28 Javascript
使用微信SDK自定义分享的方法
2019/07/03 Javascript
利用JS代码自动删除稿件的普通弹幕功能
2019/09/20 Javascript
[48:28]完美世界DOTA2联赛循环赛FTD vs Magma第二场 10月30日
2020/10/31 DOTA
讲解Python中if语句的嵌套用法
2015/05/14 Python
Python实现的在特定目录下导入模块功能分析
2019/02/11 Python
两个元祖T1=('a', 'b'),T2=('c', 'd')使用匿名函数将其转变成[{'a': 'c'},{'b': 'd'}]的几种方法
2019/03/05 Python
python中68个内置函数的总结与介绍
2020/02/24 Python
浅谈TensorFlow之稀疏张量表示
2020/06/30 Python
python中通过pip安装库文件时出现“EnvironmentError: [WinError 5] 拒绝访问”的问题及解决方案
2020/08/11 Python
Django Admin后台模型列表页面如何添加自定义操作按钮
2020/11/11 Python
顶级宝石首饰网络零售商:Angara
2016/10/25 全球购物
购买瑞典当代设计的腕表和太阳眼镜:TRIWA
2016/10/30 全球购物
SAZAC的动物连体衣和动物睡衣:Kigurumi Shop
2020/03/14 全球购物
电信专业毕业生推荐信
2013/11/18 职场文书
证婚人搞笑证婚词
2014/01/10 职场文书
四下基层实施方案
2014/03/28 职场文书
学校运动会广播稿100条
2014/09/14 职场文书
个人整改措施落实情况汇报
2014/10/29 职场文书
学会掌握自己命运的十条黄金法则:
2019/08/08 职场文书