/** * Выполнить первую задачу из очереди * @param int $indexer_strategy * @return bool|null */ public static function run($indexer_strategy = nc_search::INDEXING_NC_CRON) { $provider = nc_search::get_provider(); if ($provider->is_reindexing()) { nc_search::log(nc_search::LOG_SCHEDULER_START, "Scheduler: indexing in progress"); return false; } $intent = nc_search::load('nc_search_scheduler_intent', 'SELECT * FROM `%t%`' . ' WHERE `StartTime` <= ' . time() . ' ORDER BY `StartTime` ASC LIMIT 1')->first(); if (!$intent) { nc_search::log(nc_search::LOG_SCHEDULER_START, "Scheduler: no scheduler intents to process now"); return false; } if (nc_search::will_log(nc_search::LOG_SCHEDULER_START)) { nc_search::log(nc_search::LOG_SCHEDULER_START, "Scheduler started (planned start time: " . strftime("%Y-%m-%d %H:%M:%S", $intent->get('start_time')) . "; area: '" . preg_replace("/\\s+/u", " ", $intent->get('area_string')) . "')"); } // информация принята к сведению и больше не нужна $intent->delete(); // запуск индексации $provider->index_area($intent->get('area_string'), $indexer_strategy); }
/** * Обработать ответ пользователя (crawler) * @param nc_search_indexer_crawler_response $response * @param nc_search_indexer_link $link * @return bool */ protected function process_response(nc_search_indexer_crawler_response $response, nc_search_indexer_link $link) { $content_type = $response->get_content_type(); $parser = $this->get_parser($content_type); $parser->load($response); // пусть парсер скажет, будем ли мы обрабатывать этот документ? // (например, не будем, если есть meta robots=noindex) if (!$parser->should_index()) { return false; } // получить ссылки $page_hrefs = $this->filter_links($parser->extract_links()); $page_url = $response->get_url(); // добавить ссылки в очередь (где-то там разберутся, чтобы ссылки // не повторялись и были абсолютными): $page_link_ids = $this->task->add_links($page_hrefs, $page_url); // распарсить контент $document = $parser->get_document(); $document->set_values(array('url' => $page_url, 'path' => nc_search_util::get_url_path($page_url), 'content_type' => $content_type, 'to_delete' => false, 'last_modified' => $response->get_last_modified())); $this->apply_hierarchy_options($document); if (nc_search::will_log(nc_search::LOG_PARSER_DOCUMENT_BRIEF)) { nc_search::log(nc_search::LOG_PARSER_DOCUMENT_BRIEF, "Parsed document from '{$page_url}'. Indexed content: " . strlen($document->get('intact_content')) . " bytes"); } if (nc_search::will_log(nc_search::LOG_PARSER_DOCUMENT_VERBOSE)) { nc_search::log(nc_search::LOG_PARSER_DOCUMENT_VERBOSE, $document->dump()); } // добавить в индекс $this->index->process_document($document); // сохранить информацию о том, кто куда ссылается // (referrer_link_id сохраняется из-за неясностей/неточностей в ТЗ, которое // подразумевает, что сбор ссылок может производиться на страницах, // которые не сохраняются в индексе) $referrer_link_id = (int) $link->get_id(); // might be null $doc_id = (int) $document->get_id(); foreach ($page_link_ids as $page_link_id) { if (!$page_link_id) { continue; } $this->referrer_cache[] = "(" . $doc_id . "," . $referrer_link_id . "," . (int) $page_link_id . ")"; } return true; }
/** * Возвращает ID ссылки с указанным URL; создает объект nc_search_indexer_link * при необходимости * @param string $url * @param string $referrer * @return integer Link ID */ public function add_link($url, $referrer = null) { $full_url = $this->resolve_link($url, $referrer); // считать URL’ы с "www." и без него синонимами (просто выкинуть "www.", // к сожалению, нельзя — не у всех правильно настроен сервер) $has_www = strpos($full_url, "://www."); $full_url_with_www = $has_www ? $full_url : str_replace("://", "://www.", $full_url); $full_url_without_www = $has_www ? str_replace("://www.", "://", $full_url) : $full_url; $link = new nc_search_indexer_link(); // search for link with that URL in the database, create new if it's not there if (!$link->load_by_url(array($full_url_with_www, $full_url_without_www))) { // it's a brand new link $link->set("url", $full_url); $link->save(); if (nc_search::will_log(nc_search::LOG_PARSER_DOCUMENT_LINKS)) { nc_search::log(nc_search::LOG_PARSER_DOCUMENT_LINKS, "Added link to the queue: " . nc_search_util::decode_url($full_url)); } } return $link->get_id(); }