昨天在寫腳本的時候,發現了一個問題,當我去分塊去處理數據的時候,數據表的數據老是會出現缺失處理的狀況。 在這裏寫個筆記 記錄下此次的踩坑過程。 網上有好多地方能看到這個坑,可是都沒有給出具體的解決方案。 this
Laravel中chunk方法分塊處理數據的坑: Laravel中chunk方法分塊處理數據code
先說會引起這個問題的緣由: 主要是由於數據表的查詢與更新的where字段自同一張表,那麼咱們在更新數據的時候,就會由於chunk的分塊機制,致使查詢的數據是不全的。get
這是chunk的分塊機制源碼:源碼
public function chunk($count, callable $callback) { // 我理解的是相似於limit,offset 實現數據分頁查詢 $results = $this->forPage($page = 1, $count)->get(); while (count($results) > 0) { // On each chunk result set, we will pass them to the callback and then let the // developer take care of everything within the callback, which allows us to // keep the memory low for spinning through large result sets for working. // 若是用戶回調中,更新的字段與查詢的字段是一個條件,就會出現這樣的問題 if (call_user_func($callback, $results) === false) { return false; } $page++; $results = $this->forPage($page, $count)->get(); } return true; }
那麼如何解決這種問題呢? 我是這麼處理的:it
public function handle() { // 1.先去查詢須要更新的數據量 $count = DB::table('table') ->where('status', '=', 0) ->count(); echo "須要推送的數量:$count\r\n"; while ($count) { // 2.而後limit去查數據 $data= DB::table(self::OPEN_API_WUBA_TEST_CLUE) ->where('is_push', '=', self::IS_PUSH_FAILED) ->limit(100) ->get(); ! empty($data) && $this->processData($data); // 3.批次處理完數據,再去查詢下 須要更新的數據,直到更新完畢退出循環 $count = DB::table('table') ->where('status', '=', 0) ->count(); echo "剩餘推送的記錄數:$count\r\n"; } exit("數據所有推送完畢.\r\n"); } private function processData($data) { // TODO(xiaoyi):處理數據業務邏輯 }