色尼玛亚洲综合影院,亚洲3atv精品一区二区三区,麻豆freexxxx性91精品,欧美在线91

PHP中使用sleep函數(shù)實(shí)現(xiàn)定時(shí)任務(wù)實(shí)例分享

在某些程序中,有一些特殊的功能需要用到定時(shí)執(zhí)行,如果熟悉Linux的朋友肯定會(huì)說(shuō)這不是容易嗎,直接來(lái)個(gè)計(jì)劃任務(wù)crontab不久實(shí)現(xiàn)了嗎?這的確是可以實(shí)現(xiàn),但必須是提前知道具體的執(zhí)行時(shí)間,然后才能寫(xiě)到計(jì)劃任務(wù)里去。比如凌晨?jī)牲c(diǎn),上午七點(diǎn),或者每天上午六點(diǎn)三十分等等。

然而有時(shí)候,這個(gè)時(shí)間我們無(wú)法預(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í)間。既然無(wú)法使用計(jì)劃任務(wù),那么就只能從程序本身尋找實(shí)現(xiàn)方法。

php中,有一個(gè)sleep函數(shù),大概意思是程序執(zhí)行遇到sleep函數(shù)時(shí)暫停N秒后繼續(xù)往下執(zhí)行。如sleep(10)意思就是程序自上往下執(zhí)行,遇到sleep(10)語(yǔ)句后暫停十秒,然后繼續(xù)往下執(zhí)行。函數(shù)括號(hào)內(nèi)的參數(shù)是一個(gè)數(shù)值,代表暫停時(shí)間值,單位秒。請(qǐng)看下面一段代碼
復(fù)制代碼 代碼如下:
<?php
/**
 * sleep函數(shù)的用法
 * 瓊臺(tái)博客
 */
// 輸出當(dāng)前程序時(shí)間戳
echo time();  // out:1338088780
echo '<br />';
 
// 暫停十秒
sleep(10);
 
// 輸出時(shí)間戳
echo time(); // out:1338088790

以上程序執(zhí)行結(jié)果是
復(fù)制代碼 代碼如下:
1338088780
1338088790

我們來(lái)解析下執(zhí)行過(guò)程,第一步是打印當(dāng)前時(shí)間戳1338088780,然后暫停十秒,再打印時(shí)間戳。由于程序是等待了十秒然后再次打印時(shí)間戳,那么就是最后一次的時(shí)間戳肯定要比第一次打印的時(shí)間戳多十秒鐘,結(jié)果最后一次的時(shí)間戳是1338088790。

以上例子,我們只用了一次sleep函數(shù),頁(yè)面中可以無(wú)限制使用sleep()函數(shù)。請(qǐng)看以下代碼:
復(fù)制代碼 代碼如下:
<?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é)果是
復(fù)制代碼 代碼如下:1338088780
1338088790
1338088810

以上代碼執(zhí)行過(guò)程:
第一,打印第一次時(shí)間戳1338088780
第二,暫停十秒
第三,打印第二次時(shí)間戳 1338088790,是第一次時(shí)間戳加上十秒后的總和
第四,暫停二十秒
第五,打印第三次時(shí)間戳 1338088810,是第二次時(shí)間戳1338088790加上二十秒后的總和。

頁(yè)面中出現(xiàn)兩次sleep,第一次是十秒,第二次二十秒。由此得出以上實(shí)例總共執(zhí)行三十秒。頁(yè)面中多次出現(xiàn)sleep()函數(shù)時(shí)為累加而不是覆蓋前面的代碼。

那如何結(jié)合sleep定時(shí)執(zhí)行動(dòng)態(tài)生成時(shí)間的代碼呢?請(qǐng)看以下代碼:
復(fù)制代碼 代碼如下:
<?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

以上代碼輸出:
復(fù)制代碼 代碼如下:2012-05-27 14:58:00
2012-05-27 19:20:00

解析:開(kāi)始打印當(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í)行某些語(yǔ)句達(dá)到定時(shí)執(zhí)行效果。這里注意必須算的一個(gè)以秒為單位的時(shí)間差,如果不能算出秒差就沒(méi)法使用sleep函數(shù)功能。

最后,可能某些童鞋做實(shí)例的時(shí)候會(huì)說(shuō)怎么我的程序執(zhí)行出錯(cuò),提示超時(shí)。出現(xiàn)這個(gè)問(wèn)題不要慌,這是php默認(rèn)頁(yè)面執(zhí)行時(shí)間導(dǎo)致的,在php中默認(rèn)執(zhí)行頁(yè)面時(shí)間是三十秒鐘,這對(duì)于一般程序夠用了。但如果你要做類(lèi)似定時(shí)執(zhí)行功能就必須再頭部聲明設(shè)置下執(zhí)行時(shí)間set_time_limit(0)。0是代表不限時(shí),單位是秒。最后整體貼出代碼:
復(fù)制代碼 代碼如下:
<?php
/**
 * sleep函數(shù)定時(shí)執(zhí)行動(dòng)態(tài)生成時(shí)間段的代碼
 * 瓊臺(tái)博客
 */
// 設(shè)置頁(yè)面執(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技術(shù)PHP中使用sleep函數(shù)實(shí)現(xiàn)定時(shí)任務(wù)實(shí)例分享,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 连城县| 常熟市| 苗栗县| 灵台县| 柯坪县| 台南市| 蓝山县| 淮安市| 西平县| 祥云县| 永清县| 文安县| 台中县| 天津市| 宁陕县| 达州市| 微山县| 涿州市| 临夏市| 普安县| 资兴市| 同心县| 宁远县| 墨竹工卡县| 将乐县| 湟源县| 伊春市| 庐江县| 沙坪坝区| 滨州市| 屏南县| 进贤县| 德州市| 公安县| 武穴市| 海淀区| 丹寨县| 如东县| 温泉县| 姜堰市| 承德市|