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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM