我在瀏覽器中,點擊一個按鈕a,啟動了一個定時器A,我又點擊了相同的按鈕a,又啟動了一個定時器B(定時器A和定時器B是實現(xiàn)相同的功能的),如何實現(xiàn):點擊一個按鈕,只能啟動一個定時器A,再次點擊這個按鈕后,無法新建定時器B?代碼如下:
public function onConnect($connection)
{
// 定義并執(zhí)行一個定時器
$time_interval = 5;// 每5秒執(zhí)行一次定時器
// 給connection對象臨時添加一個timer_id屬性保存定時器id
$connection->timer_id = Timer::add($time_interval, function () use ($connection) {
// 連接數(shù)據(jù)庫并時時取出數(shù)據(jù)
$id = '1DF22E206ACE919DC47E1A840594CC72';
$infoMessage = Db::name('message')->find($id);
$data = $infoMessage['title'];
// 將數(shù)據(jù)庫數(shù)據(jù)時時發(fā)送給客戶端
$connection->send($data);
file_put_contents("wangjing.txt", "定時器ID:" . $connection->timer_id . ",時時數(shù)據(jù):" . $data . ",當(dāng)前時間:" . date("y-m-d H:i:s") . "\n", FILE_APPEND | LOCK_EX);
});
file_put_contents("wangjing.txt", "定時器ID為:$connection->timer_id\n", FILE_APPEND | LOCK_EX);//有多少個子進(jìn)程,就會打印多少個定時器ID
}
用共享內(nèi)存Apcu或者redis增加一個業(yè)務(wù)鎖,定時器結(jié)束時銷毀鎖;
APCu是血緣關(guān)系進(jìn)程可以共享,redis無限制甚至可以不是一臺服務(wù)器實例,根據(jù)自身情況選擇;
當(dāng)點擊按鈕時,創(chuàng)建鎖并創(chuàng)建定時器,如果創(chuàng)建鎖失敗了,則忽略;注意在定時器銷毀時回收鎖;
目前定時器沒有實現(xiàn),定時器id是自增的,你也可以通過利用workerman的eventloop自行實現(xiàn)定時器,使用靜態(tài)數(shù)組保存timer的id,判斷id是否存在