由于php是单线程的,没有和其它语言一样可以开出多个线程互相调用,所以如果要实现php定时执行任务就需要一点技巧,这里说的是不使用系统自带的计划任务。

我可以利用一个死循环就是while(1){}来无限重复,这里就有几个问题了。

1.php脚本运行时间有限制,骑士要解决超时问题很简单,直接用set_time_limit();这样就不会限制脚本执行时间了。

2.php在用户页面请求关闭后就会结束程序释放资源,为了不然定时任务不受页面请求的影响这里可以用ignore_user_abort();忽略用户取消请求。

3.解决上诉问题后还有问题就是,while(1){}这样搞下去会不会很耗资源?没错,不过有办法,不到时间的时候让程序"睡"一会,用sleep();

解决上面问题后我们就可以编写php定时执行任务的脚本了.当然作为程序员要尽可能地去优化代码的性能。我们可以在while(1){}里面根据时间来判断最大睡眠时间,这样就可以保证程序准时又相对节约资源。我写了个例子,本人保留代码所有权:

  1. /**
  2. +------------------------------------------------------------------------------
  3. *  定时执行计划任务
  4. +------------------------------------------------------------------------------
  5. * @param $runTime 指定程序运行时间
  6. * @author Yovae <yovae@qq.com>
  7. * @version 1.0           2011-6-3
  8. +------------------------------------------------------------------------------
  9. */
  10. function plane($runTime)
  11. {
  12.  $runT=explode(":",$runTime);
  13. $hour=$runT[0];
  14. $min=$runT[1];
  15. if($hour=="00")
  16. {
  17.   $hour=24;
  18. }
  19. else
  20. {
  21.  $hour=intval($hour);
  22. }
  23. if($min=="00")
  24. {
  25.   $min=0;
  26. }
  27. else
  28. {
  29.  $min=intval($min);
  30. }
  31.  
  32.  
  33. while(1)                  
  34. {
  35.     ......  //这里插入要定时运行的脚本
  36.     while(1)//开始监测时间 定时执行 startPrintWaterMark()
  37.     {
  38.         if(date('H:i')==$runTime)
  39.         {
  40.             break;
  41.         }
  42.         else
  43.         {
  44.             $waitHour=intval(abs(intval(date('H'))-$hour));
  45.             if($waitHour==0)
  46.             {
  47.                 $waitMin=intval(abs($min-intval(date('i'))));
  48.                 if($waitMin>1)
  49.                 {
  50.                     sleep(($waitMin-1)*60);
  51.                 }
  52.             }
  53.             else
  54.             {
  55.                 sleep($waitHour*3600);
  56.             }
  57.         }
  58.     }
  59. }
  60. }
  61. 转自:http://www.yovae.com/blog/php
 posted on 2012-05-30 18:25  全栈在路上  阅读(149)  评论(0编辑  收藏  举报