我舉例個場景,我起了一個5秒一次請求的定時任務(wù),任務(wù)中5秒后業(yè)務(wù)代碼還沒執(zhí)行完,這時候會不會出現(xiàn)沒有執(zhí)行完,就啟動下次任務(wù),這樣子久而久之造成堆積呢?
我自己的見解就是,在一次任務(wù)中,使用請求庫中的并發(fā)請求來調(diào)用接口通知
我是類似場景,但用的是timer,如:
public function onworkerstart(){
$this->task();
}
private function task(){
curl_init();
//.......
curl_exec();
Timer::add(5,function(){
$this->task();
},null,false);
}
因為我這邊遠程調(diào)用有延遲,還要處理一堆通知業(yè)務(wù),可能預(yù)設(shè)的時間內(nèi)沒辦法完成,所以擔(dān)心在未完成之前,當前的任務(wù)又開始執(zhí)行了
我不管是什么樣的定時系統(tǒng)都會加鎖
文件鎖
$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)址請求鎖, curlGet, curlPut 為封裝的處理 curl 的請求參數(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] );
}