由於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[0];
- $min=$runT[1];
- 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