/** * Запланировать запуск переиндексирования области или правила в указанное время * @param string $area_string * @param integer $timestamp */ public static function schedule_indexing($area_string, $timestamp) { // Если данная область уже поставлена в очередь на более раннее или ближайшее // время, не нужно добавлять ещё раз $interval = $timestamp + nc_search::get_setting('MinScheduleInterval'); $intent = nc_search::load('nc_search_scheduler_intent', "SELECT * FROM `%t%`" . " WHERE `StartTime` <= {$interval}" . " AND `AreaString` = '" . nc_search_util::db_escape($area_string) . "'")->first(); // type is ignored if ($intent) { // уже есть такое расписание! if ($intent->get('start_time') > $timestamp) { $intent->set('start_time', $timestamp); // let's run it sooner } } else { $intent = new nc_search_scheduler_intent(array('start_time' => $timestamp, 'type' => nc_search_scheduler_intent::ON_REQUEST, 'area_string' => $area_string)); } $intent->save(); }
/** * @return nc_search_rule self */ public function schedule_next_run() { $type_scheduled = nc_search_scheduler_intent::SCHEDULED; $interval_type = $this->get('interval_type'); $intent = new nc_search_scheduler_intent(); // remove old scheduled intents $where = $intent->make_condition('area_string', $this->get_id(), 'type', $type_scheduled); nc_db()->query("DELETE FROM `{$intent->get_table_name()}` WHERE {$where}"); if ($interval_type != 'on_request') { $interval = $this->get('interval'); if ($interval_type == 'day_of_month') { $next_scheduled_time = $this->get_day_of_month_future_timestamp($interval, $this->get('hour'), $this->get('minute')); } else { // 'minute', 'hour', 'day' // hour, minute содержат время начала применения правила $start_timestamp = mktime($this->get('hour'), $this->get('minute'), 0); $next_scheduled_time = $this->get_interval_future_timestamp($start_timestamp, "{$interval} {$interval_type}"); } $intent->set('start_time', $next_scheduled_time)->set('type', nc_search_scheduler_intent::SCHEDULED)->set('area_string', $this->get_id())->save(); } return $this; }