在某些程式中,有一些特殊的功能需要用到定時執行,如果熟悉Linux的朋友肯定會說這不是容易嗎,直接來個計劃任務crontab不久實現了嗎?這的確是可以實現,但必須是提前知道具體的執行時間,然後才能寫到計劃任務裡去。比如淩晨兩點,上午七點,或者每天上午六點三十分等等。
然而有時候,這個時間我們無法預知,而執行時間是程式動態產生的。然後在動態產生的時間後執行某些程式片段,這裡就不能用Linux的crontab計劃任務了,因為每次執行的時間都是動態產生,而計劃任務需要知道一個定死了的時間。既然無法使用計劃任務,那麼就只能從程式本身尋找實現方法。
在PHP中,有一個sleep函數,大概意思是程式執行遇到sleep函數時暫停N秒後繼續往下執行。如sleep(10)意思就是程式自上往下執行,遇到sleep(10)語句後暫停十秒,然後繼續往下執行。函數括弧內的參數是一個數值,代表暫停時間值,單位秒。請看下面一段代碼
<?php/** * sleep函數的用法 * 瓊台部落格 */// 輸出當前程式時間戳記echo time(); // out:1338088780echo '<br />'; // 暫停十秒sleep(10); // 輸出時間戳記echo time(); // out:1338088790
以上程式執行結果是
複製代碼 代碼如下:
1338088780
1338088790
我們來解析下執行過程,第一步是列印目前時間戳1338088780,然後暫停十秒,再列印時間戳記。由於程式是等待了十秒然後再次列印時間戳記,那麼就是最後一次的時間戳記肯定要比第一次列印的時間戳記多十秒鐘,結果最後一次的時間戳記是1338088790。
以上例子,我們只用了一次sleep函數,頁面中可以無限制使用sleep()函數。請看以下代碼:
<?php/** * sleep函數的用法 * 瓊台部落格 */// 輸出第一次時間戳記echo time(); // out: 1338088780echo '<br />'; // 暫停十秒sleep(10); // 輸出第二次時間戳記echo time(); // out: 1338088790echo '<br />'; // 暫停二十秒鐘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:00echo '<br />'; // 動態產生時間 範圍在今天下午六點到晚上零點前的任意時間$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
以上代碼輸出:
複製代碼 代碼如下:
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