我在uchome 中 分析到 uchome是這樣做的
把所有的計劃任務存放到數據庫
每次用戶進行操作或打開頁面的時候都按排序執行一條計劃任務 也就是輪番判斷時間到了的 就在用戶進程中執行
uchome的計劃任務代碼在 /source/function_cronphp
上面只自己分析uchome代碼關於計劃任務大概的結果 拋磚引玉 希望誰有好的方法拿出來共享
ignore_user_abort()
我前一段時間徹底研究過計劃任務認為計劃任務的思路很多但最適合Web的還是觸發式的就是類似於DZ和PHPWind的似乎大多數web應用也都是這麼做的再說幾種其他的供參考
為了提供穩定的觸發用crontab+wget或者ab提供定時訪問
nohup + php寫守護程序
直接用php寫個死循環還提供觸發這時需要用緩存或者數據庫來協助推出循環還有必須用sleep或者usleep控制觸發頻率
crontab+php
web觸發方式這也有區別一種是定時觸發一種是定周期觸發DZ和PHPWind都是定時觸發我最後采用的是定周期觸發
具體的實現思路 很容易想就不多說了
自己有主機肯定用crontab來執行命令行PHP
沒有只能寫在代碼中了
用crontab會比較好 如果用循環的話 最好也要把循環和具體處理程序分開 不然內存會一直增加
今天一不小心在php手冊上發現了這個函數ignore_user_abort這個函數可以幫助我們實現像linux中的cron一樣實現計劃任務下面一起來看下該如何來實現
首先看下php手冊對這個函數的解釋
Description
int ignore_user_abort ([ bool $setting ] )
Sets whether a client disconnect should cause a script to be aborted
也就是說無論客戶端是否關閉浏覽器下面的程序都會執行
再看下其參數
Parameters
setting
If not set the function will only return the current setting
這個函數接受一個參數來決定是否啟用ignore_user_abort的功能
再看其返回值
Return Values
Returns the previous setting as a boolean
這裡說返回前一次的設置並且是bool值得經過我的測試這個說法是不對的返回的明明是int型的不相信的話大家可以寫一個php文件來測試下
說了這麼多了到底該如何用php的這個函數實現計劃任務呢?還跌借助另外一個函數這個函數是set_time_limit通過set_time_limit)可以設置程序的運行時間為無限制php默認的運行時間是秒通過set_time_limit()可以讓程序無限制的執行下去在程序執行之前加上ignore_user_abort()和set_time_limit()即可以了最終程序該如何寫呢?給大家一個例子
代碼如下:
<?php
ignore_user_abort(); // run script in background
set_time_limit(); // run script forever
$interval=; // do every minutes…
do{
$fp = fopen(‘texttxta);
fwrite($fptest);
fclose($fp);
sleep($interval); // wait minutes
}while(true);
?>
From:http://tw.wingwit.com/Article/program/PHP/201311/20894.html