PHP中利用sleep函数实现定时执行功能

PHP 2012-05-27 sleep,计划,定时,set_time_limit,执行时

在某些程序中,有一些特殊的功能需要用到定时执行,如果熟悉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中利用sleep函数实现定时执行功能

文章地址:http://www.qttc.net/20120560.html

除非标注,琼台博客所有博文均为原创,转载请加文字链接注明来源

乳名?小名?昵称?网名?均可

email,放心,我不会给你乱投广告的

想获得回访就把你的站点URL写上(没有留空)

[NOTICE]木要投放广告
[NOTICE]木要骂人,说不该说的话
[NOTICE]自由言论,但要遵纪守法

Comments 22

  • cron + check
    2012-08-07 16:48:52 [ 跟帖 ]
    1 #
  • 发现这个不错,学习学习来。感恩每天,感恩未曾谋面的朋友,你的每一次踏访猪三戒,都是一次对我们的支持。我希望每天都在进步一点点,我是一位平凡的小小草根站长,我不期待辉煌的闪光耀眼,我希望只是那颗起得最早的启明星,我只有勤奋奋斗,因为梦想是用汗水实现的,与兄弟共勉。我期待你和你朋友们来看看猪三戒。
    2012-05-30 15:28:46 [ 跟帖 ]
    你这是ctrl+c的吧!
    2012-05-30 15:43:56 [ 跟帖 ]
    2 #
  • 呵呵,萌嘟嘟这么受欢迎啊,不简单啊,
    2012-05-30 14:31:52 [ 跟帖 ]
    只要在我的小站留下足迹,我就会常常去各位小站光顾,当然,除了广告的以外
    2012-05-30 14:43:49 [ 跟帖 ]
    3 #
  • 好多好多的技术贴啊
    2012-05-30 01:08:23 [ 跟帖 ]
    算是一些心得,给遇到同样问题的童鞋指引指引,也给自己留下点记忆,你的小站也不错,我几乎每天都去逛你的小站哦
    2012-05-30 09:36:41 [ 跟帖 ]
    4 #
  • 技术博,是必要要捧场滴,支持搞技术的博主
    2012-05-28 19:02:11 [ 跟帖 ]
    严重酬谢
    2012-05-29 09:19:21 [ 跟帖 ]
    5 #
  • 过来看看 送IP了 ·~
    2012-05-28 16:29:53 [ 跟帖 ]
    6 #
  • 主题down好了 再改一改 就不会有广告什么的了
    2012-05-28 11:26:54 [ 跟帖 ]
    现在网上牛人多,写的主题兼容性都挺好。也省事。
    2012-05-28 11:34:03 [ 跟帖 ]
    7 #
  • 我的主题是down的...汗颜...
    2012-05-28 11:21:39 [ 跟帖 ]
    我这个博客程序是自己写的,原来用wordpress的时候,随意下载主题,但被挂了N多广告,无奈只好自己写一套。
    2012-05-28 11:23:16 [ 跟帖 ]
    8 #
  • 好简的主题额。
    2012-05-28 11:16:50 [ 跟帖 ]
    呵呵,称不上主题,自己随便写的样式。比起你的,我这差远了。
    2012-05-28 11:19:08 [ 跟帖 ]
    9 #
  • 这个和js的sleep差不多的用法。 请博主有空到我博客坐坐,呵呵。地址:www.datacentersky.com
    2012-05-27 22:37:19 [ 跟帖 ]
    之前,我有去过你的小站哦。你的技术文章也不错,只是跟我的方向有区别,多多学习哈!
    2012-05-28 09:51:00 [ 跟帖 ]
    10 #
  • 站长很用心哦!加油!每个重点词语都用红色的字标记。顶!
    2012-05-27 19:02:53 [ 跟帖 ]
    呵呵,谢谢支持啊!小站不仅是写出来,给需要的人看,同时也是记录自己平时遇到的问题。
    2012-05-28 09:48:10 [ 跟帖 ]
    顶一下 ncie
    2014-08-01 19:04:36 [ 跟帖 ]
    sdfafs
    2015-01-24 15:30:48 [ 跟帖 ]
    11 #