gqinvs 发表于 2015-8-29 11:09:51

php定时执行任务

由于php是单线程的,没有和其它语言一样可以开出多个线程互相调用,所以如果要实现php定时执行任务就需要一点技巧,这里说的是不使用系统自带的计划任务。
  我可以利用一个死循环就是while(1){}来无限重复,这里就有几个问题了。
  1.php脚本运行时间有限制,骑士要解决超时问题很简单,直接用set_time_limit();这样就不会限制脚本执行时间了。
  2.php在用户页面请求关闭后就会结束程序释放资源,为了不然定时任务不受页面请求的影响这里可以用ignore_user_abort();忽略用户取消请求。
  3.解决上诉问题后还有问题就是,while(1){}这样搞下去会不会很耗资源?没错,不过有办法,不到时间的时候让程序"睡"一会,用sleep();
  解决上面问题后我们就可以编写php定时执行任务的脚本了.当然作为程序员要尽可能地去优化代码的性能。我们可以在while(1){}里面根据时间来判断最大睡眠时间,这样就可以保证程序准时又相对节约资源。我写了个例子,本人保留代码所有权:


[*]/**
[*]+------------------------------------------------------------------------------
[*]*定时执行计划任务
[*]+------------------------------------------------------------------------------
[*]* @param $runTime 指定程序运行时间
[*]* @author Yovae <yovae@qq.com>
[*]* @version 1.0         2011-6-3
[*]+------------------------------------------------------------------------------
[*]*/
[*]function plane($runTime)
[*]{
[*] $runT=explode(":",$runTime);
[*]$hour=$runT;
[*]$min=$runT;
[*]if($hour=="00")
[*]{
[*]$hour=24;
[*]}
[*]else
[*]{
[*] $hour=intval($hour);
[*]}
[*]if($min=="00")
[*]{
[*]$min=0;
[*]}
[*]else
[*]{
[*] $min=intval($min);
[*]}
[*]
[*]
[*]while(1)                  
[*]{
[*]    ......//这里插入要定时运行的脚本
[*]    while(1)//开始监测时间 定时执行 startPrintWaterMark()
[*]    {
[*]      if(date('H:i')==$runTime)
[*]      {
[*]            break;
[*]      }
[*]      else
[*]      {
[*]            $waitHour=intval(abs(intval(date('H'))-$hour));
[*]            if($waitHour==0)
[*]            {
[*]                $waitMin=intval(abs($min-intval(date('i'))));
[*]                if($waitMin>1)
[*]                {
[*]                  sleep(($waitMin-1)*60);
[*]                }
[*]            }
[*]            else
[*]            {
[*]                sleep($waitHour*3600);
[*]            }
[*]      }
[*]    }
[*]}
[*]}
[*]转自:http://www.yovae.com/blog/php
页: [1]
查看完整版本: php定时执行任务