PHP中使用sleep函數(shù)實(shí)現(xiàn)定時(shí)任務(wù)實(shí)例分享
在某些程序中,有一些特殊的功能需要用到定時(shí)執(zhí)行,如果熟悉Linux的朋友肯定會(huì)說這不是容易嗎,直接來個(gè)計(jì)劃任務(wù)crontab不久實(shí)現(xiàn)了嗎?這的確是可以實(shí)現(xiàn),但必須是提前知道具體的執(zhí)行時(shí)間,然后才能寫到計(jì)劃任務(wù)里去。比如凌晨兩點(diǎn),上午七點(diǎn),或者每天上午六點(diǎn)三十分等等。
然而有時(shí)候,這個(gè)時(shí)間我們無法預(yù)知,而執(zhí)行時(shí)間是程序動(dòng)態(tài)生成的。然后在動(dòng)態(tài)生成的時(shí)間后執(zhí)行某些程序片段,這里就不能用Linux的crontab計(jì)劃任務(wù)了,因?yàn)槊看螆?zhí)行的時(shí)間都是動(dòng)態(tài)生成,而計(jì)劃任務(wù)需要知道一個(gè)定死了的時(shí)間。既然無法使用計(jì)劃任務(wù),那么就只能從程序本身尋找實(shí)現(xiàn)方法。
在PHP中,有一個(gè)sleep函數(shù),大概意思是程序執(zhí)行遇到sleep函數(shù)時(shí)暫停N秒后繼續(xù)往下執(zhí)行。如sleep(10)意思就是程序自上往下執(zhí)行,遇到sleep(10)語句后暫停十秒,然后繼續(xù)往下執(zhí)行。函數(shù)括號(hào)內(nèi)的參數(shù)是一個(gè)數(shù)值,代表暫停時(shí)間值,單位秒。請看下面一段代碼
<?php /** * sleep函數(shù)的用法 * 瓊臺(tái)博客 */ // 輸出當(dāng)前程序時(shí)間戳 echo time(); // out:1338088780 echo '<br />'; // 暫停十秒 sleep(10); // 輸出時(shí)間戳 echo time(); // out:1338088790
以上程序執(zhí)行結(jié)果是
1338088780
1338088790
我們來解析下執(zhí)行過程,第一步是打印當(dāng)前時(shí)間戳1338088780,然后暫停十秒,再打印時(shí)間戳。由于程序是等待了十秒然后再次打印時(shí)間戳,那么就是最后一次的時(shí)間戳肯定要比第一次打印的時(shí)間戳多十秒鐘,結(jié)果最后一次的時(shí)間戳是1338088790。
以上例子,我們只用了一次sleep函數(shù),頁面中可以無限制使用sleep()函數(shù)。請看以下代碼:
<?php /** * sleep函數(shù)的用法 * 瓊臺(tái)博客 */ // 輸出第一次時(shí)間戳 echo time(); // out: 1338088780 echo '<br />'; // 暫停十秒 sleep(10); // 輸出第二次時(shí)間戳 echo time(); // out: 1338088790 echo '<br />'; // 暫停二十秒鐘 sleep(20); // 輸出第三次時(shí)間戳 echo time(); // out: 1338088810
以上程序執(zhí)行結(jié)果是
1338088790
1338088810
以上代碼執(zhí)行過程:
第一,打印第一次時(shí)間戳1338088780
第二,暫停十秒
第三,打印第二次時(shí)間戳 1338088790,是第一次時(shí)間戳加上十秒后的總和
第四,暫停二十秒
第五,打印第三次時(shí)間戳 1338088810,是第二次時(shí)間戳1338088790加上二十秒后的總和。
頁面中出現(xiàn)兩次sleep,第一次是十秒,第二次二十秒。由此得出以上實(shí)例總共執(zhí)行三十秒。頁面中多次出現(xiàn)sleep()函數(shù)時(shí)為累加而不是覆蓋前面的代碼。
那如何結(jié)合sleep定時(shí)執(zhí)行動(dòng)態(tài)生成時(shí)間的代碼呢?請看以下代碼:
<?php /** * sleep函數(shù)定時(shí)執(zhí)行動(dòng)態(tài)生成時(shí)間段的代碼 * 瓊臺(tái)博客 */ // 目前時(shí)間 echo date('Y-m-d H:i:s'); // out:2012-05-27 14:58:00 echo '<br />'; // 動(dòng)態(tài)生成時(shí)間 范圍在今天下午六點(diǎn)到晚上零點(diǎn)前的任意時(shí)間 $datetime = date('Y-m-d').' '.rand('18,23').':'.rand('0,59').':'.rand('0,59'); // 2012-05-27 19:20:00 // 算得時(shí)間戳 $a = strtotime($datetime); // 算得時(shí)間差 $reduce = $a-time(); // sleep等待 sleep($reduce); // 執(zhí)行到時(shí)間后執(zhí)行的代碼塊 echo date('Y-m-d H:i:s'); // out:2012-05-27 19:20:00
以上代碼輸出:
2012-05-27 19:20:00
解析:開始打印當(dāng)前時(shí)間,然后隨機(jī)算出程序往后執(zhí)行時(shí)間 2012-05-27 19:20:00,由于sleep接受參數(shù)是一個(gè)以秒為單位的一個(gè)數(shù)值,所以先把生成的時(shí)間轉(zhuǎn)換為時(shí)間戳然后再用時(shí)間戳減去當(dāng)前時(shí)間戳得出一個(gè)時(shí)間差,再sleep即可達(dá)到程序在隨機(jī)生成時(shí)間執(zhí)行某些語句達(dá)到定時(shí)執(zhí)行效果。這里注意必須算的一個(gè)以秒為單位的時(shí)間差,如果不能算出秒差就沒法使用sleep函數(shù)功能。
最后,可能某些童鞋做實(shí)例的時(shí)候會(huì)說怎么我的程序執(zhí)行出錯(cuò),提示超時(shí)。出現(xiàn)這個(gè)問題不要慌,這是PHP默認(rèn)頁面執(zhí)行時(shí)間導(dǎo)致的,在PHP中默認(rèn)執(zhí)行頁面時(shí)間是三十秒鐘,這對(duì)于一般程序夠用了。但如果你要做類似定時(shí)執(zhí)行功能就必須再頭部聲明設(shè)置下執(zhí)行時(shí)間set_time_limit(0)。0是代表不限時(shí),單位是秒。最后整體貼出代碼:
<?php /** * sleep函數(shù)定時(shí)執(zhí)行動(dòng)態(tài)生成時(shí)間段的代碼 * 瓊臺(tái)博客 */ // 設(shè)置頁面執(zhí)行時(shí)間,否則會(huì)有超時(shí)錯(cuò)誤提示 set_time_limit(0); // 目前時(shí)間 echo date('Y-m-d H:i:s'); // out:2012-05-27 14:58:00 // 動(dòng)態(tài)生成時(shí)間 范圍在今天下午六點(diǎn)到晚上零點(diǎn)前的任意時(shí)間 $datetime = date('Y-m-d').' '.rand('18,23').':'.rand('0,59').':'.rand('0,59'); // 2012-05-27 19:20:00 // 算得時(shí)間戳 $a = strtotime($datetime); // 算得時(shí)間差 $reduce = $a-time(); // sleep等待 sleep($reduce); // 執(zhí)行到時(shí)間后執(zhí)行的代碼塊 echo date('Y-m-d H:i:s'); // out:2012-05-27 19:20:00
- php基于協(xié)程實(shí)現(xiàn)異步的方法分析
- 詳解php協(xié)程知識(shí)點(diǎn)
- PHP生成器(generator)和協(xié)程的實(shí)現(xiàn)方法詳解
- PHP7下協(xié)程的實(shí)現(xiàn)方法詳解
- 關(guān)于PHP中協(xié)程和阻塞的一些理解與思考
- PHP 進(jìn)程池與輪詢調(diào)度算法實(shí)現(xiàn)多任務(wù)的示例代碼
- PHP定時(shí)執(zhí)行計(jì)劃任務(wù)的多種方法小結(jié)
- php定時(shí)計(jì)劃任務(wù)的實(shí)現(xiàn)方法詳解
- php守護(hù)進(jìn)程 加linux命令nohup實(shí)現(xiàn)任務(wù)每秒執(zhí)行一次
- PHP實(shí)現(xiàn)簡單的協(xié)程任務(wù)調(diào)度demo示例
相關(guān)文章
ThinkPHP框架整合微信支付之Native 掃碼支付模式二圖文詳解
這篇文章主要介紹了ThinkPHP框架整合微信支付之Native 掃碼支付模式,結(jié)合圖文形式詳細(xì)分析了thinkPHP整合微信掃碼支付功能的具體步驟與相關(guān)操作技巧,以及與模式一的區(qū)別,需要的朋友可以參考下2019-04-04yii2使用GridView實(shí)現(xiàn)數(shù)據(jù)全選及批量刪除按鈕示例
本篇文章主要介紹了yii2使用GridView實(shí)現(xiàn)數(shù)據(jù)全選及批量刪除按鈕示例,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-03-03php中g(shù)et_headers函數(shù)的作用及用法的詳細(xì)介紹
本篇文章介紹了,在php中g(shù)et_headers函數(shù)的作用及用法。需要的朋友參考下2013-04-04php array_keys 返回?cái)?shù)組的鍵名
php中array_keys函數(shù)用于返回包含數(shù)組中所有鍵名的一個(gè)新數(shù)組。本文章向大家詳細(xì)介紹PHP array_keys函數(shù)使用方法。需要的碼農(nóng)可以參考一下2016-10-10PHP數(shù)據(jù)庫鏈接類(PDO+Access)實(shí)例分享
這篇文章主要介紹了PHP數(shù)據(jù)庫鏈接類(PDO+Access),有需要的朋友可以參考一下2013-12-12詳解PHP中strlen和mb_strlen函數(shù)的區(qū)別
在PHP中,strlen與mb_strlen是求字符串長度的函數(shù),但是對(duì)于一些初學(xué)者來說,如果不看手冊,也許不太清楚其中的區(qū)別2014-03-03laravel model模型處理之修改查詢或修改字段時(shí)的類型格式案例
今天小編就為大家分享一篇laravel model模型處理之修改查詢或修改字段時(shí)的類型格式案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨想過來看看吧2019-10-10