本文目錄一覽:
php discuz的定時任務是什麼原理怎麼實現的?求高手解答
php中定時計劃任務的實現原理:
當 PHP 腳本正常地運行 NORMAL 狀態時,連接為有效。當遠程客戶端中斷連接時,ABORTED 狀態的標記將會被打開。遠程客戶端連接的中斷通常是由用戶點擊 STOP 按鈕導致的。當連接時間超過 PHP 的時限時,TIMEOUT 狀態的標記將被打開。
示例代碼:
?php
ignore_user_abort(true);set_time_limit(0);
date_default_timezone_set(‘PRC’); // 切換到中國的時間
$run_time = strtotime(‘+1 day’); // 定時任務第一次執行的時間是明天的這個時候
$interval = 3600*12; // 每12個小時執行一次
if(!file_exists(dirname(__FILE__).’/cron-run’)) exit(); // 在目錄下存放一個cron-run文件,如果這個文件不存在,說明已經在執行過程中了,該任務就不能再激活,執行第二次,否則這個文件被多次訪問的話,服務器就要崩潰掉了
do {
if(!file_exists(dirname(__FILE__).’/cron-switch’)) break; // 如果不存在cron-switch這個文件,就停止執行,這是一個開關的作用
$gmt_time = microtime(true); // 當前的運行時間,精確到0.0001秒
$loop = isset($loop) $loop ? $loop : $run_time – $gmt_time; // 這裡處理是為了確定還要等多久才開始第一次執行任務,$loop就是要等多久才執行的時間間隔
$loop = $loop 0 ? $loop : 0;
if(!$loop) break; // 如果循環的間隔為零,則停止
sleep($loop);
// …
// 執行某些代碼
// …
@unlink(dirname(__FILE__).’/cron-run’); // 這裡就是通過刪除cron-run來告訴程序,這個定時任務已經在執行過程中,不能再執行一個新的同樣的任務
$loop = $interval;
} while(true);
php定時執行任務的幾個方法
PHP定時執行的三種方式實現
1、windows 的計劃任務 2、linux的腳本程序 3、讓web瀏覽器定時刷新
具體實現
1、windows計劃任務
PHP很少在win服務器上跑,具體實現也不再深究,看網上實現的原理大概是寫bat腳本,然後讓window任務添加執行這個bat腳本。
2、linux 的腳本實現
這裡主要使用到crontab這個命令,
使用方式 :
複製代碼 代碼如下:crontab filecrontab [ -u user ] [ -u user ] { -l | -r | -e }
說明 :
crontab是用來讓使用者在固定時間或固定間隔執行程式之用
使用crontab寫shell腳本,然後讓PHP調用shell,這個是利用linux的特性,應該還不算PHP自身語言的特性
3、PHP實現定時執行計劃任務
使用php讓瀏覽器刷新需要解決幾個問題
PHP腳本執行時間限制,默認的是30m 解決辦法:set_time_limit();或者修改PHP.ini 設置max_execution_time時間(不推薦)
如果客戶端瀏覽器關閉,程序可能就被迫終止,解決辦法:ignore_user_abort即使關閉頁面依然正常執行
如果程序一直執行很有可能會消耗大量的資源,解決辦法使用sleep使用程序休眠一會,然後在執行
PHP定時執行的代碼:
?php ignore_user_abort();//關掉瀏覽器,PHP腳本也可以繼續執行. set_time_limit(3000);// 通過set_time_limit(0)可以讓程序無限制的執行下去 $interval=5;// 每隔5s運行 //方法1–死循環 do{ echo ‘測試’.time().’br/’; sleep($interval);// 等待5s }while(true); //方法2—sleep 定時執行 require_once ‘./curlClass.php’;//引入文件 $curl = new httpCurl();//實例化 $stime = $curl-getmicrotime(); for($i=0;$i=10;$i++){ echo ‘測試’.time().’br/’; sleep($interval);// 等待5s } ob_flush(); flush(); $etime = $curl-getmicrotime(); echo ‘hr’; echo round(($etime-stime),4);//程序執行時間
測試的時候發現這個效率並不是很高。
總結:
個人感覺PHP定時執行任務的效率不是很高,建議關於定時執行任務的工作還是交給shell來做吧。
Windows中使用計劃任務自動執行PHP程序實例
所謂任務計劃就是由計算機自動調用用戶事先設置好的應用程序,從而達到簡化用戶操作的目的。利用Windows
2000的任務計劃程序(相當與*NIX下的cron程序,這裡不再對其詳述),我們可以安排任何腳本、程序或文檔在最恰當的時候運行,從而滿足自己的需要。下面以Windows
2000為例。
具體來說,我們若需利用任務計劃程序自動運行則應執行如下步驟:
單擊”開始”按鈕,然後依次選擇”程序”→”附件”→”系統工具”→”任務計劃”(或者是”設置”→”控制面板”→”任務計劃”),啟動Windows
2000的任務計劃管理程序。
在”任務計劃”窗口中雙擊”添加任務計劃”圖標,啟動系統的”任務計劃嚮導”,然後單擊”下一步”按鈕,在給出的程序列表中選擇需要自動運行的應用程序,然後單擊”下一步”按鈕。
設置適當的任務計劃名稱並選擇自動執行這個任務的時間頻率(如每天、每星期、每月、一次性、每次啟動計算機時、每次登錄時等),然後單擊”下一步”按鈕。
此時系統將會要求用戶對程序運行的具體時間進行設置,如幾號、幾點鐘、哪幾個時間段才能運行等,我們只需根據自己的需要加以設置即可。
接下來系統將會要求用戶設置適當的用戶名及密碼(如圖5所示),以便系統今後能自動加以運行。
最後,我們只需單擊”完成”按鈕即可將相應任務添加到Windows
2000的任務計劃程序中,此後它就會自動”記住”這個任務,一旦系統時間及相關條件與用戶設置的計劃相符,它就會自動調用用戶所指定的應用程序,十分方
便(每次啟動Windows
2000的時候,任務計劃程序都會自動啟動,並在後台運行,確保用戶的計劃能夠按時執行)。
現在我們來測試一下剛才所建的任務是否成功,鼠標右鍵單擊”php”程序圖標(如圖6所示),在彈出的菜單裏面選擇”運行”。一般情況下程序圖標只要這樣
激活運行就可以正常啟動。如果運行失敗可查看用戶和密碼是否設置正確,還有確定”Task
Scheduler”服務是否已啟動,本人當初就是為了節省系統資源把它關掉了導致運行失敗,害我找了大半天。另外也可從”系統日誌”里查看到底是什麼原
因造成運行失敗的。
好了,講了這麼多任務計劃的應用,現在我們切入正題,下面將介紹兩個例子:
一、讓PHP定時運行
編輯如下代碼,並保存為test.php:
複製代碼
代碼如下:
?php
$fp
=
@fopen(“test.txt”,
“a+”);
fwrite($fp,
date(“Y-m-d
H:i:s”)
.
“
讓PHP定時運行吧!\n”);
fclose($fp);
?
原創文章,作者:A877W,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/129957.html