zoukankan      html  css  js  c++  java
  • php定时执行任务

    由于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

    更多文章

    欢迎访问更多关于消息中间件的原创文章:

    关注微信公众号

    欢迎大家关注我的微信公众号阅读 更多 原创文章:

    just think and do it
  • 相关阅读:
    无符号数和有符号数字操作的一些注意事项
    C/C++的基本数据类型
    GoLang字符串比较(二)
    Sphinx使用指南
    GoLang字符串比较(一)
    并发与调度亲和性
    golang scheduler工作窃取
    g0
    如何将markdown转换成微信公众号中支持的html
    goroutine是如何被回收的
  • 原文地址:https://www.cnblogs.com/itdream/p/2526705.html
Copyright © 2011-2022 走看看