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

在某些程序中,有一些特殊的功能需要用到定时执行,如果熟悉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
(0)

相关推荐

  • PHP定时执行任务的3种方法详解

    PHP定时执行的三种方式实现 1.windows 的计划任务 2.linux的脚本程序 3.让web浏览器定时刷新 具体实现 1.windows计划任务 PHP很少在win服务器上跑,具体实现也不再深究,看网上实现的原理大概是写bat脚本,然后让window任务添加执行这个bat脚本. 2.linux 的脚本实现 这里主要使用到crontab这个命令, 使用方式 : 复制代码 代码如下: crontab   filecrontab [ -u user ] [ -u user ] { -l | -

  • 详解PHP实现定时任务的五种方法

    定时运行任务对于一个网站来说,是一个比较重要的任务,比如定时发布文档,定时清理垃圾信息等,现在的网站大多数都是采用PHP动态语言开发的,而对于PHP的实现决定了它没有Java和.Net这种AppServer的概念,而http协议是一个无状态的协议,PHP只能被用户触发,被调用,调用后会自动退出内存,没有常驻内存. 如果非要PHP去实现定时任务, 可以有以下几种解决方案: 一. 简单直接不顾后果型 <?php ignore_user_abort();//关掉浏览器,PHP脚本也可以继续执行. se

  • 详解PHP执行定时任务的实现思路

    PHP本身是没有定时功能的,PHP也不能多线程.PHP的定时任务功能必须通过和其他工具结合才能实现,例如WordPress内置了wp-cron的功能,很厉害. 一.Linux服务器上使用CronTab定时执行php 我们先从相对比较复杂的服务器执行php谈起.服务器上安装了php,就可以执行php文件,无论是否安装了nginx或Apache这样的服务器环境软件.而Linux中,使用命令行,用CronTab来定时任务,又是绝佳的选择,而且也是效率最高的选择. 首先,进入命令行模式.作为服务器的li

  • PHP定时执行任务实现方法详解(Timer)

    下面通过理论讲解,实例分析,效果展示的方式给大家分享下PHP定时执行任务实现方法. 定时器任务,在WEB应用比较常见,如何使用PHP实现定时器任务,大致有两种方案: 1)使用Crontab命令,写一个shell脚本,在脚本中调用PHP文件,然后定期执行该脚本: 2)配合使用ignore_user_abort()和set_time_limit(),使脚本脱离浏览器运行. 前者是利用Linux的特性,和PHP本身没有多大关系,后者使用场景有限,且只能由一次HTTP请求触发该脚本,执行完后退出.那么我

  • php计划任务之ignore_user_abort函数实现方法

    本文实例讲述了php计划任务之ignore_user_abort函数实现方法.分享给大家供大家参考.具体分析如下: PHP 不会检测到用户是否已断开连接,直到尝试向客户机发送信息为止,简单地使用 echo 语句无法确保信息发送,参阅 flush() 函数,代码如下: 复制代码 代码如下: <?php  ignore_user_abort(true);  set_time_limit(0);    while(1) {   $fp  = fopen('time_task.txt',"a+&q

  • php定时执行任务设置详解

    今天有一个哥们问我这个问题,问题是这样的他有一个iis的服务器,要定时执行一个扫描的php脚本,这个怎么弄,每小时执行一次,下面是windows的设置 1)在控制面板中双击任务计划,打开了Windows任务计划窗口. 2)双击添加任务,打开任务计划向导.点击下一步. 3)点击浏览,选择要运行的程序 4 ) 输入计划名称,选择 每天 5)设置起始时间.选择每天.起始日期.下一步. 6)输入密码,该密码是该系统的用户名(用 默认 即可)的密码.下一步 7)选择在单击完成时,打开此任务的高级属性. 8

  • php版本的cron定时任务执行器使用实例

    本文实例讲述了php版本的cron定时任务执行器使用方法,是非常实用的一个功能应用.具体方法如下: 由于服务器crontab只能精确到分钟,因此程序的起点也是分钟. 该功能一共包括三个部分: 一.配置文件: 配置文件是用来返回要执行的定时任务文件,注意一下*的使用就行了,有两个模式,就是 Y-m-d H:i        :年 月 日 时 分 N H:i            :星期(1 - 7|周一 - 周日) 时 分 配置文件croning.php如下: /** * 任务管理器配置文件 *

  • 如何离线执行php任务

    直接上代码,主要函数 ignore_user_abort(true); 这个函数忽略了终端被关闭(打开的网页被关闭),后面 getfiles()这函数是执行采集任务的自定义函数,后面又配置了下路径 打开写好的页面,关闭,后面发现任务都能执行完成,有兴趣的可以试试. <?php //设置忽略是否关闭终端窗口 ignore_user_abort(true); ini_set('max_execution_time', '0'); //采集页面函数,看不懂执行百度curl php function g

  • PHP实现定时执行任务的方法

    本文实例讲述了PHP实现定时执行任务的方法,代码简单实用.分享给大家供大家参考. 具体实现方法如下: ignore_user_abort(true); //客户端断开时忽略脚本中止(允许脚本一直执行) set_time_limit(0); //设置脚本最长执行时间,0不限制 do{ $handle = fopen('auto.txt', 'w'); if($fp) { $text = '你好\n\r'; $count = 0; for($i=1; $i<10; $i++) { if(! $c =

  • 如何使用纯PHP实现定时器任务(Timer)

    定时器任务,在WEB应用比较常见,如何使用PHP实现定时器任务,大致有两种方案:1)使用Crontab命令,写一个shell脚本,在脚本中调用PHP文件,然后定期执行该脚本:2)配合使用ignore_user_abort()和set_time_limit(),使脚本脱离浏览器运行.前者是利用Linux的特性,和PHP本身没有多大关系,后者使用场景有限,且只能由一次HTTP请求触发该脚本,执行完后退出.那么我们如何使用纯PHP实现纯粹的定时器任务,且能适应认识任务业务需求? 基础知识 此程序在Li

随机推荐