在某些程式中,有一些特殊的功能需要用到定時執行,如果熟悉linux的朋友肯定會說這不是容易嗎,直接來個計畫任務crontab不久實現了嗎?這的確是可以實現,但必須是提前知道具體的執行時間,然後才能寫到計畫任務裡去。比如凌晨兩點,上午七點,或者每天上午六點三十分等等。
然而有時候,這個時間我們無法預知,而執行時間是程式動態生成的。然後在動態生成的時間後執行某些程式片段,這裡就不能用linux的crontab計畫任務了,因為每次執行的時間都是動態生成,而計畫任務需要知道乙個定死了的時間。既然無法使用計畫任務,那麼就只能從程式本身尋找實現方法。
在php中,有乙個sleep函式,大概意思是程式執行遇到sleep函式時暫停n秒後繼續往下執行。如sleep(10)意思就是程式自上往下執行,遇到sleep(10)語句後暫停十秒,然後繼續往下執行。函式括號內的引數是乙個數值,代表暫停時間值,單位秒。請看下面一段**
<?php /**
* sleep函式的用法
* 瓊臺部落格
*/// 輸出當前程式時間戳
echo time(); // out:1338088780
echo '';
// 暫停十秒
sleep(10);
// 輸出時間戳
echo time(); // out:1338088790
以上程式執行結果是
複製** **如下:
1338088780
1338088790
我們來解析下執行過程,第一步是列印當前時間戳1338088780,然後暫停十秒,再列印時間戳。由於程式是等待了十秒然後再次列印時間戳,那麼就是最後一次的時間戳肯定要比第一次列印的時間戳多十秒鐘,結果最後一次的時間戳是1338088790。
以上例子,我們只用了一次sleep函式,頁面中可以無限制使用sleep()函式。請看以下**:
<?php /**
* sleep函式的用法
* 瓊程式設計客棧臺部落格
*/// 輸出第一次時間戳
echo time(); // out: 1338088780
echo '';
// 暫停十秒
sleep(10);
// 輸出第二次時間戳
echo time(); // out: 1338088790
echo '';
// 暫停二十秒鐘
sleep(20);
// 輸出第三次時間戳
echo time(); // out: 1338088810
以上程式執行結果是
複製** **如下:
1338088780
1338088790
1338088810
以上**執行過程:
第一,列印第一次時間戳1338088780
第二,暫停十秒
第三,列印第二次時間戳 1338088790,是第一次時間戳加上十秒後的總和
第四,暫停二十秒
第五,列印第三次時間戳 1338088810,是第二次時間戳1338088790加上二十秒後的總和。
頁面**現兩次sleep,第一次是十秒,第二次二十秒。由此得出以上例項總共執行三十秒。頁面中多次出現sleep()函式時為累加而不是覆蓋前面的**。
那如何結合sleep定時執行動態生成時間的**呢?請看以下**:
<?php /**
* sleep函式定時執行動態生成時間段的**
* 瓊臺部落格
*/// 目前時間
echo date('y-m-d h:i:s'); // out:2012-05-27 14:58:00
echo '';
// 動態生成時間 範圍在今天下午六點到晚上零點前的任意時間
$datetime = date('y-m-d').' '.rand('18,23').':'.rand('0,59').':'.rand('0,59'); // 2012-05-27 19:20:00
// 算得時間戳
$a = strtotime($datetime);
// 算得時間差
$reduce = $a-time();
// sleep等待
sleep($reduce);
// 執行到時間後執行的**塊
echo dat程式設計客棧e('y-m-d h:i:s'); // out:2012-05-27 19:20:00
以上**輸出:
複製** **如下:
2012-05-27 14:58:00
2012-05-27 19:20:00
解析:開始列印當前時間,然後隨機算出程式往後執行時間 2012-05-27 19:20:00,由於sleep接受引數是乙個以秒為單位的乙個數值,所以先把生成的時間轉換為時間戳然後再用時間戳減去當前時間戳得出乙個時間差,再sleep即可達到程式在隨機生成時間執行某些語句達到定時執行效果。這裡注意必須算的乙個以秒為單位的時間差,如果不能算出秒差就沒法使用sleep函式功能。
最後,可能某些童鞋做例項的時候會說怎麼我的程式執行出錯,提示超時。出現這個問題不要慌,這是php預設頁面執行時間導致的,在php中預設執行頁面時間是三十秒鐘,這對於一般程式夠用了。但如果你要做類似定時執行功能就必須再頭部宣告設定下執行時間set_time_limit(0)。0是代表不限時,單位是秒。最後整體貼出**:
<?php /**
* sleep函式定時執行動態生成時間段的**
* 瓊臺部落格
*/// 設定頁面執行時間,否則會有超時錯誤提示
set_time_limit(0);
// 目前程式設計客棧時間
echo date('y-m-d h:i:s'); // out:2012-05-27 14:58:00
// 動態生成時間 範圍在今天下午六點到晚上程式設計客棧零點前的任意時間
$datetime = date('y-m-d').' '.rand('18,23').':'.rand('0,59').':'.rand('0,59'); // 2012-05-27 19:20:00
// 算得時間戳
$a = strtotime($datetime);
// 算得時間差
$reduce = $a-time();
// sleep等待
sleep($reduce);
// 執行到時間後執行的**塊
echo date('y-m-d h:i:s'); // out:2012-05-27 19:20:00
本文標題: php中使用sleep函式實現定時任務例項分享
本文位址: /wangluo/php/112558.html
在Qt中使用sleep
在qt中使用sleep 關於sleep函式,我們先來看一下他的作用 sleep函式是使呼叫sleep函式的執行緒休眠,執行緒主動放棄時間片。當經過指定的時間間隔後,再啟動執行緒,繼續執行 sleep函式並不能起到定時的作用,主要作用是延時。在一些多執行緒中可能會看到sleep 0 其主要目的是讓出時...
php 函式中使用static
function sendheader num,rtarr null return sapi 看pw原始碼的時候發現setheader 函式中使用static關鍵字,很奇怪,以前也沒這樣用過。static用在函式裡面,宣告一次變數後,如果再次呼叫這個函式將會在初始值延續,如 sapi這裡將累加。ec...
PHP實現 輸出 sleep 輸出
sleep 函式一般用在暫停上,但是乙個php一旦有了sleep,其他的輸出 print,echo 就都要等待sleep 函式的完成,這是因為緩衝區,這裡有詳細解釋 在這裡不贅述,而如果要實現先輸出再等待再輸出,則用到了ob flush 和flush 在沒有開啟快取時,指令碼輸出的內容都在伺服器端處...