/** * * @param nc_search_indexer $indexer * @throws nc_search_exception * @return boolean is task finished */ public function loop(nc_search_indexer $indexer) { $cycle_number = 0; $save_cycles = nc_search::get_setting('IndexerSaveTaskEveryNthCycle'); while (true) { // stop prematurely: if (!$this->check_connection()) { $indexer->cancel(); return true; // nobody listens anyway } if ($this->interrupt_if_needed($indexer, $cycle_number)) { return false; } // сохранять задачу каждые X циклов if ($cycle_number % $save_cycles == 0) { $indexer->save_task(); } switch ($indexer->next()) { case nc_search_indexer::TASK_FINISHED: return true; // we're done // we're done case nc_search_indexer::TASK_STEP_FINISHED: if ($this->delay) { if ($this->interrupt_if_needed($indexer, $cycle_number)) { return false; } sleep($this->delay); } break; case nc_search_indexer::TASK_STEP_SKIPPED: break; default: throw new nc_search_exception("Incorrect return value from nc_search_indexer::next()"); } $cycle_number++; } }