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 文件上传全攻略
Apr 28 PHP
php 操作调试的方法
Jul 12 PHP
有道搜索和IP138的IP的API接口(PHP应用)
Nov 29 PHP
php实现信用卡校验位算法THE LUHN MOD-10示例
May 07 PHP
PHP生成短网址的3种方法代码实例
Jul 08 PHP
PHP使用stream_context_create()模拟POST/GET请求的方法
Apr 02 PHP
CI框架无限级分类+递归的实现代码
Nov 01 PHP
thinkPHP+ajax实现统计页面pv浏览量的方法
Mar 15 PHP
thinkphp集成前端脚手架Vue-cli的教程图解
Aug 30 PHP
关于php unset对json_encode的影响详解
Nov 14 PHP
PHP类的自动加载机制实现方法分析
Jan 10 PHP
如何在Laravel之外使用illuminate组件详解
Sep 20 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+jQuery 注册模块开发详解
2014/10/14 PHP
php抽象类用法实例分析
2015/07/07 PHP
thinkPHP多语言切换设置方法详解
2016/11/11 PHP
php实现连接access数据库并转txt写入的方法
2017/02/08 PHP
PHP内部实现打乱字符串顺序函数str_shuffle的方法
2019/02/14 PHP
thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例
2020/03/02 PHP
JavaScript Scoping and Hoisting 翻译
2012/07/03 Javascript
JavaScript 垃圾回收机制分析
2013/10/10 Javascript
jquery中页面Ajax方法$.load的功能使用介绍
2014/10/20 Javascript
JS作为值的函数用法示例
2016/06/20 Javascript
js 将图片连接转换成base64格式的简单实例
2016/08/10 Javascript
Node.js检测端口(port)是否被占用的简单示例
2016/09/29 Javascript
JS 实现Base64编码与解码实例详解
2016/11/07 Javascript
JavaScript制作简易计算器(不用eval)
2017/02/05 Javascript
利用js实现前后台传送Json的示例代码
2018/03/29 Javascript
vue实现的组件兄弟间通信功能示例
2018/12/04 Javascript
详解vue 图片上传功能
2019/04/30 Javascript
基于JS实现数字动态变化显示效果附源码
2019/07/18 Javascript
使用Taro实现小程序商城的购物车功能模块的实例代码
2020/06/05 Javascript
vue3.0实现点击切换验证码(组件)及校验
2020/11/18 Vue.js
Python三元运算实现方法
2015/01/12 Python
Python中使用HTMLParser解析html实例
2015/02/08 Python
Python函数中的函数(闭包)用法实例
2016/03/15 Python
Python 模板引擎的注入问题分析
2017/01/01 Python
PyTorch在Windows环境搭建的方法步骤
2020/05/12 Python
Selenium Webdriver元素定位的八种常用方式(小结)
2021/01/13 Python
python中if嵌套命令实例讲解
2021/02/25 Python
深入剖析HTML5 内联框架iFrame
2016/05/04 HTML / CSS
HTML5 新表单类型示例代码
2018/03/20 HTML / CSS
编码转换,怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串
2014/01/07 面试题
内刊编辑求职自荐书范文
2014/02/19 职场文书
珍惜资源保护环境的建议书
2014/05/14 职场文书
导游词怎么写
2015/02/04 职场文书
学校党支部公开承诺书
2015/04/30 职场文书
运动会广播稿50字
2015/08/19 职场文书
Python 使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换
2022/04/24 Python