我舉例個(gè)場(chǎng)景,我起了一個(gè)5秒一次請(qǐng)求的定時(shí)任務(wù),任務(wù)中5秒后業(yè)務(wù)代碼還沒(méi)執(zhí)行完,這時(shí)候會(huì)不會(huì)出現(xiàn)沒(méi)有執(zhí)行完,就啟動(dòng)下次任務(wù),這樣子久而久之造成堆積呢?
我自己的見(jiàn)解就是,在一次任務(wù)中,使用請(qǐng)求庫(kù)中的并發(fā)請(qǐng)求來(lái)調(diào)用接口通知
我是類似場(chǎng)景,但用的是timer,如:
public function onworkerstart(){
$this->task();
}
private function task(){
curl_init();
//.......
curl_exec();
Timer::add(5,function(){
$this->task();
},null,false);
}
因?yàn)槲疫@邊遠(yuǎn)程調(diào)用有延遲,還要處理一堆通知業(yè)務(wù),可能預(yù)設(shè)的時(shí)間內(nèi)沒(méi)辦法完成,所以擔(dān)心在未完成之前,當(dāng)前的任務(wù)又開(kāi)始執(zhí)行了
我不管是什么樣的定時(shí)系統(tǒng)都會(huì)加鎖
文件鎖
$lockFile = 'timer_every_day.lock';
if (file_exists($lockFile)) {
return; //exit;
}
file_put_contents($lockFile, getmypid());
try {
$argv = [__FILE__, 'everyDay/exec'];
include(DIR . "index.php");
} finally {
unlink($lockFile);
}
網(wǎng)址請(qǐng)求鎖, curlGet, curlPut 為封裝的處理 curl 的請(qǐng)求參數(shù)與返回結(jié)果
$lockUrl = 'https://xxxxx';
if (curlGet($lockUrl )->isLock == true) {
return; //exit;
}
curlPut($lockUrl, ['lock' => true] );
try {
curlGet('http://xxxx1');
curlGet('http://xxxx2');
curlGet('http://xxxx3');
curlGet('http://xxxx4');
} finally {
curlPut($lockUrl, ['lock' => false] );
}