使用場景
使用計劃任務執行收益分配等需要修改狀態的操作,當網站數據量或併發量較大導致程序或者數據庫阻塞,以至於當前任務未完成時,第二個任務已經開始運行。此時前一個任務從數據庫讀取到的待執行數據的狀態可能還沒有改變,兩個任務可能會讀取重複的需要操作的待執行信息列表,導致重複分配等後果
此時我們需要保證在前一個任務未執行結束時,第二個任務不開始或者不執行。計劃任務的執行是由操作系統控制,我們不好操作;我們便於操作的是腳本文件,可以使腳本不執行
思路
基本思路是使用php自帶的 flock 文件鎖函數,當計劃任務執行時,給文件上鎖,結束後解鎖。下一個任務執行時,判斷文件是否已解鎖,未解鎖則跳過執行程序
步驟
//首先建立一個文件作爲腳本的替代文件,因爲不能直接在文件內給當前文件加鎖
//通過判斷替代文件的鎖定狀態來決定腳本執行與否
$fp = fopen('file_lock.txt', "r");//打開文件
// 加鎖
if(flock($fp, LOCK_EX)){
//加鎖成功,說明文件之前未鎖定,執行操作
......
//執行完畢後,解鎖文件
flock($fp,LOCK_UN);
}else{
//加鎖失敗,說明文件未解鎖,跳過執行操作
echo 'no act';
}
fclose($fp);