php中定時(shí)計(jì)劃任務(wù)的實(shí)現(xiàn)原理
更新時(shí)間:2013年01月08日 14:30:24 作者:
php中定時(shí)計(jì)劃任務(wù)的實(shí)現(xiàn)原理,需要的朋友可以參考下
根據(jù)php手冊(cè)簡單介紹一些相關(guān)的知識(shí):
1.連接處理:
在 PHP 內(nèi)部,系統(tǒng)維護(hù)著連接狀態(tài),其狀態(tài)有三種可能的情況:
0 - NORMAL(正常)
1 - ABORTED(異常退出)
2 - TIMEOUT(超時(shí))
當(dāng) PHP 腳本正常地運(yùn)行 NORMAL 狀態(tài)時(shí),連接為有效。當(dāng)遠(yuǎn)程客戶端中斷連接時(shí),ABORTED 狀態(tài)的標(biāo)記將會(huì)被打開。遠(yuǎn)程客戶端連接的中斷通常是由用戶點(diǎn)擊 STOP 按鈕導(dǎo)致的。當(dāng)連接時(shí)間超過 PHP 的時(shí)限時(shí),TIMEOUT 狀態(tài)的標(biāo)記將被打開。
可以決定腳本是否需要在客戶端中斷連接時(shí)退出。有時(shí)候讓腳本完整地運(yùn)行會(huì)帶來很多方便,即使沒有遠(yuǎn)程瀏覽器接受腳本的輸出。默認(rèn)的情況是當(dāng)遠(yuǎn)程客戶端連接中斷時(shí)腳本將會(huì)退出。該處理過程可由 php.ini 的 ignore_user_abort 或由 Apache .conf 設(shè)置中對(duì)應(yīng)的"php_value ignore_user_abort"以及 ignore_user_abort() 函數(shù)來控制。如果沒有告訴 PHP 忽略用戶的中斷,腳本將會(huì)被中斷,除非通過 register_shutdown_function() 設(shè)置了關(guān)閉觸發(fā)函數(shù)。通過該關(guān)閉觸發(fā)函數(shù),當(dāng)遠(yuǎn)程用戶點(diǎn)擊 STOP 按鈕后,腳本再次嘗試輸出數(shù)據(jù)時(shí),PHP 將會(huì)檢測(cè)到連接已被中斷,并調(diào)用關(guān)閉觸發(fā)函數(shù)。
腳本也有可能被內(nèi)置的腳本計(jì)時(shí)器中斷。默認(rèn)的超時(shí)限制為 30 秒。這個(gè)值可以通過設(shè)置 php.ini 的 max_execution_time 或 Apache .conf 設(shè)置中對(duì)應(yīng)的"php_value max_execution_time"參數(shù)或者 set_time_limit() 函數(shù)來更改。當(dāng)計(jì)數(shù)器超時(shí)的時(shí)候,腳本將會(huì)類似于以上連接中斷的情況退出,先前被注冊(cè)過的關(guān)閉觸發(fā)函數(shù)也將在這時(shí)被執(zhí)行。在該關(guān)閉觸發(fā)函數(shù)中,可以通過調(diào)用 connection_status() 函數(shù)來檢查超時(shí)是否導(dǎo)致關(guān)閉觸發(fā)函數(shù)被調(diào)用。如果超時(shí)導(dǎo)致了關(guān)閉觸發(fā)函數(shù)的調(diào)用,該函數(shù)將返回 2。
需要注意的一點(diǎn)是 ABORTED 和 TIMEOUT 狀態(tài)可以同時(shí)有效。這在告訴 PHP 忽略用戶的退出操作時(shí)是可能的。PHP 將仍然注意用戶已經(jīng)中斷了連接但腳本仍然在運(yùn)行的情況。如果到了運(yùn)行的時(shí)間限制,腳本將被退出,設(shè)置過的關(guān)閉觸發(fā)函數(shù)也將被執(zhí)行。在這時(shí)會(huì)發(fā)現(xiàn)函數(shù) connection_status() 返回 3。
2.相關(guān)函數(shù):
int ignore_user_abort ( [bool setting] )
This function sets whether a client disconnect should cause a script to be aborted. It will return the previous setting and can be called without an argument to not change the current setting and only return the current setting.
int connection_aborted ( void )
Returns TRUE if client disconnected.
int connection_status ( void )
Returns the connection status bitfield.
為了定時(shí)更新某一文件,需要程序自動(dòng)運(yùn)行,從網(wǎng)上搜到了兩種方法:ignore_user_abort() 和crontab
ignore_user_abort()函數(shù)搭配set_time_limit(0)和sleep($interval)即可實(shí)現(xiàn)程序自動(dòng)運(yùn)行更新,下面是一個(gè)實(shí)例
ignore_user_abort(); //即使Client斷開(如關(guān)掉瀏覽器),PHP腳本也可以繼續(xù)執(zhí)行.
set_time_limit(0); // 執(zhí)行時(shí)間為無限制,php默認(rèn)的執(zhí)行時(shí)間是30秒,通過set_time_limit(0)可以讓程序無限制的執(zhí)行下去
$interval=60*5; // 每隔5分鐘運(yùn)行
do{
$fp = fopen('test.txt','a');
fwrite($fp,'test');
fclose($fp);
sleep($interval); // 等待5分鐘
}while(true);
只要運(yùn)行上面的頁面,然后關(guān)掉,程序就會(huì)一直運(yùn)行下去。
Linux 下有種更簡單的方法,就是crontab命令
crontab命令的功能是在一定的時(shí)間間隔調(diào)度一些命令的執(zhí)行。
crontab 使用方法: crontab [ -e | -l | -r ] 文件名 -e:編輯任務(wù) -l:顯示任務(wù)信息 -r:刪除定時(shí)執(zhí)行任務(wù)信息
crontab的格式:
* * * * * Command
分 時(shí) 日 月 星期 要運(yùn)行的命令
crontab的例子:
*/5 * * * * lynx http://www.dbjr.com.cn
每5分鐘訪問一次 www.dbjr.com.cn
0 8 * * * lynx http://www.dbjr.com.cn
每天早上8點(diǎn)訪問 www.dbjr.com.cn
0 10 6 * 1-5 lynx http://www.dbjr.com.cn
每個(gè)月的6號(hào)和每個(gè)禮拜的星期一到星期五的早上10點(diǎn)訪問 www.dbjr.com.cn
0 5 7 8 * lynx http://www.dbjr.com.cn
8月7日早上5點(diǎn)訪問 www.dbjr.com.cn
上面幾個(gè)特殊的意思:
"*"代表所有的取值范圍內(nèi)的數(shù)字,"/"代表每的意思,"*/5"表示每5個(gè)單位,"-"代表從某個(gè)數(shù)字到某個(gè)數(shù)字,","分開幾個(gè)離散的數(shù)字。
1.連接處理:
在 PHP 內(nèi)部,系統(tǒng)維護(hù)著連接狀態(tài),其狀態(tài)有三種可能的情況:
0 - NORMAL(正常)
1 - ABORTED(異常退出)
2 - TIMEOUT(超時(shí))
當(dāng) PHP 腳本正常地運(yùn)行 NORMAL 狀態(tài)時(shí),連接為有效。當(dāng)遠(yuǎn)程客戶端中斷連接時(shí),ABORTED 狀態(tài)的標(biāo)記將會(huì)被打開。遠(yuǎn)程客戶端連接的中斷通常是由用戶點(diǎn)擊 STOP 按鈕導(dǎo)致的。當(dāng)連接時(shí)間超過 PHP 的時(shí)限時(shí),TIMEOUT 狀態(tài)的標(biāo)記將被打開。
可以決定腳本是否需要在客戶端中斷連接時(shí)退出。有時(shí)候讓腳本完整地運(yùn)行會(huì)帶來很多方便,即使沒有遠(yuǎn)程瀏覽器接受腳本的輸出。默認(rèn)的情況是當(dāng)遠(yuǎn)程客戶端連接中斷時(shí)腳本將會(huì)退出。該處理過程可由 php.ini 的 ignore_user_abort 或由 Apache .conf 設(shè)置中對(duì)應(yīng)的"php_value ignore_user_abort"以及 ignore_user_abort() 函數(shù)來控制。如果沒有告訴 PHP 忽略用戶的中斷,腳本將會(huì)被中斷,除非通過 register_shutdown_function() 設(shè)置了關(guān)閉觸發(fā)函數(shù)。通過該關(guān)閉觸發(fā)函數(shù),當(dāng)遠(yuǎn)程用戶點(diǎn)擊 STOP 按鈕后,腳本再次嘗試輸出數(shù)據(jù)時(shí),PHP 將會(huì)檢測(cè)到連接已被中斷,并調(diào)用關(guān)閉觸發(fā)函數(shù)。
腳本也有可能被內(nèi)置的腳本計(jì)時(shí)器中斷。默認(rèn)的超時(shí)限制為 30 秒。這個(gè)值可以通過設(shè)置 php.ini 的 max_execution_time 或 Apache .conf 設(shè)置中對(duì)應(yīng)的"php_value max_execution_time"參數(shù)或者 set_time_limit() 函數(shù)來更改。當(dāng)計(jì)數(shù)器超時(shí)的時(shí)候,腳本將會(huì)類似于以上連接中斷的情況退出,先前被注冊(cè)過的關(guān)閉觸發(fā)函數(shù)也將在這時(shí)被執(zhí)行。在該關(guān)閉觸發(fā)函數(shù)中,可以通過調(diào)用 connection_status() 函數(shù)來檢查超時(shí)是否導(dǎo)致關(guān)閉觸發(fā)函數(shù)被調(diào)用。如果超時(shí)導(dǎo)致了關(guān)閉觸發(fā)函數(shù)的調(diào)用,該函數(shù)將返回 2。
需要注意的一點(diǎn)是 ABORTED 和 TIMEOUT 狀態(tài)可以同時(shí)有效。這在告訴 PHP 忽略用戶的退出操作時(shí)是可能的。PHP 將仍然注意用戶已經(jīng)中斷了連接但腳本仍然在運(yùn)行的情況。如果到了運(yùn)行的時(shí)間限制,腳本將被退出,設(shè)置過的關(guān)閉觸發(fā)函數(shù)也將被執(zhí)行。在這時(shí)會(huì)發(fā)現(xiàn)函數(shù) connection_status() 返回 3。
2.相關(guān)函數(shù):
int ignore_user_abort ( [bool setting] )
This function sets whether a client disconnect should cause a script to be aborted. It will return the previous setting and can be called without an argument to not change the current setting and only return the current setting.
int connection_aborted ( void )
Returns TRUE if client disconnected.
int connection_status ( void )
Returns the connection status bitfield.
為了定時(shí)更新某一文件,需要程序自動(dòng)運(yùn)行,從網(wǎng)上搜到了兩種方法:ignore_user_abort() 和crontab
ignore_user_abort()函數(shù)搭配set_time_limit(0)和sleep($interval)即可實(shí)現(xiàn)程序自動(dòng)運(yùn)行更新,下面是一個(gè)實(shí)例
復(fù)制代碼 代碼如下:
ignore_user_abort(); //即使Client斷開(如關(guān)掉瀏覽器),PHP腳本也可以繼續(xù)執(zhí)行.
set_time_limit(0); // 執(zhí)行時(shí)間為無限制,php默認(rèn)的執(zhí)行時(shí)間是30秒,通過set_time_limit(0)可以讓程序無限制的執(zhí)行下去
$interval=60*5; // 每隔5分鐘運(yùn)行
do{
$fp = fopen('test.txt','a');
fwrite($fp,'test');
fclose($fp);
sleep($interval); // 等待5分鐘
}while(true);
只要運(yùn)行上面的頁面,然后關(guān)掉,程序就會(huì)一直運(yùn)行下去。
Linux 下有種更簡單的方法,就是crontab命令
crontab命令的功能是在一定的時(shí)間間隔調(diào)度一些命令的執(zhí)行。
crontab 使用方法: crontab [ -e | -l | -r ] 文件名 -e:編輯任務(wù) -l:顯示任務(wù)信息 -r:刪除定時(shí)執(zhí)行任務(wù)信息
crontab的格式:
* * * * * Command
分 時(shí) 日 月 星期 要運(yùn)行的命令
crontab的例子:
*/5 * * * * lynx http://www.dbjr.com.cn
每5分鐘訪問一次 www.dbjr.com.cn
0 8 * * * lynx http://www.dbjr.com.cn
每天早上8點(diǎn)訪問 www.dbjr.com.cn
0 10 6 * 1-5 lynx http://www.dbjr.com.cn
每個(gè)月的6號(hào)和每個(gè)禮拜的星期一到星期五的早上10點(diǎn)訪問 www.dbjr.com.cn
0 5 7 8 * lynx http://www.dbjr.com.cn
8月7日早上5點(diǎn)訪問 www.dbjr.com.cn
上面幾個(gè)特殊的意思:
"*"代表所有的取值范圍內(nèi)的數(shù)字,"/"代表每的意思,"*/5"表示每5個(gè)單位,"-"代表從某個(gè)數(shù)字到某個(gè)數(shù)字,","分開幾個(gè)離散的數(shù)字。
您可能感興趣的文章:
- PHP并發(fā)多進(jìn)程處理利器Gearman使用介紹
- 詳解PHP實(shí)現(xiàn)定時(shí)任務(wù)的五種方法
- linux使用crontab實(shí)現(xiàn)PHP執(zhí)行計(jì)劃定時(shí)任務(wù)
- 如何使用純PHP實(shí)現(xiàn)定時(shí)器任務(wù)(Timer)
- PHP定時(shí)執(zhí)行計(jì)劃任務(wù)的多種方法小結(jié)
- 在WINDOWS中設(shè)置計(jì)劃任務(wù)執(zhí)行PHP文件的方法
- PHP計(jì)劃任務(wù)之關(guān)閉瀏覽器后仍然繼續(xù)執(zhí)行的函數(shù)
- php定時(shí)計(jì)劃任務(wù)的實(shí)現(xiàn)方法詳解
- linux實(shí)現(xiàn)php定時(shí)執(zhí)行cron任務(wù)詳解
- win7計(jì)劃任務(wù)定時(shí)執(zhí)行PHP腳本設(shè)置圖解
- php使用gearman進(jìn)行任務(wù)分發(fā)操作實(shí)例詳解
相關(guān)文章
PHP extract 將數(shù)組拆分成多個(gè)變量的函數(shù)
extract()函數(shù)提取關(guān)聯(lián)數(shù)組(對(duì)數(shù)字索引數(shù)組無效)每對(duì)key和value,生成以key為變量名、value為對(duì)應(yīng)值的多組新變量。2010-06-06PHP遍歷目錄函數(shù)opendir()、readdir()、closedir()、rewinddir()總結(jié)
這篇文章主要介紹了PHP遍歷目錄函數(shù)opendir()、readdir()、closedir()、rewinddir()總結(jié),并給出了一個(gè)綜合使用這些函數(shù)的例子做了一個(gè)簡易文件瀏覽器,需要的朋友可以參考下2014-11-11windows環(huán)境下php配置memcache的具體操作步驟
本篇文章是對(duì)windows環(huán)境下php配置memcache的具體操作步驟進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06PHP中l(wèi)ocaleconv()函數(shù)的用法
今天小編就為大家分享一篇關(guān)于PHP中l(wèi)ocaleconv()函數(shù)的用法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03PHP parse_ini_file函數(shù)的應(yīng)用與擴(kuò)展操作示例
這篇文章主要介紹了PHP parse_ini_file函數(shù)的應(yīng)用與擴(kuò)展操作,結(jié)合實(shí)例形式分析了php擴(kuò)展parse_ini_file函數(shù)解析配置文件相關(guān)操作技巧,需要的朋友可以參考下2019-01-01PHP刪除二維數(shù)組中相同元素及數(shù)組重復(fù)值的方法示例
這篇文章主要介紹了PHP刪除二維數(shù)組中相同元素及數(shù)組重復(fù)值的方法,涉及php針對(duì)數(shù)組的遍歷、判斷、比較等相關(guān)操作技巧,需要的朋友可以參考下2017-05-05