weekly release 4.0dev
[moodle.git] / search / cli / indexer.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * CLI search indexer
19  *
20  * @package    search
21  * @copyright  2016 Dan Poltawski <dan@moodle.com>
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 define('CLI_SCRIPT', true);
27 require(__DIR__.'/../../config.php');
28 require_once($CFG->libdir.'/clilib.php');      // cli only functions
30 list($options, $unrecognized) = cli_get_params(array('help' => false, 'force' => false,
31         'reindex' => false, 'timelimit' => 0),
32         array('h' => 'help', 'f' => 'force', 'r' => 'reindex', 't' => 'timelimit'));
34 if ($unrecognized) {
35     $unrecognized = implode("\n  ", $unrecognized);
36     cli_error(get_string('cliunknowoption', 'admin', $unrecognized));
37 }
39 if ($options['help']) {
40     $help =
41 "Index search data
43 Options:
44 -h, --help              Print out this help
45 -r, --reindex           Reindex data
46 -f, --force             Allow indexer to run, even if global search is disabled.
47 -t=<n>, --timelimit=<n> Stop after indexing for specified time (in seconds)
49 Examples:
50 \$ sudo -u www-data /usr/bin/php search/cli/indexer.php --reindex
51 \$ sudo -u www-data /usr/bin/php search/cli/indexer.php --timelimit=300
52 ";
54     echo $help;
55     die;
56 }
58 if ($options['timelimit'] && $options['reindex']) {
59     cli_error('Cannot apply time limit when reindexing');
60 }
62 if (!\core_search\manager::is_global_search_enabled() && empty($options['force'])) {
63     cli_error('Global search is disabled. Use --force if you want to force an index while disabled');
64 }
66 if (!$searchengine = \core_search\manager::search_engine_instance()) {
67     cli_error(get_string('engineserverstatus', 'search'));
68 }
69 if (!$searchengine->is_installed()) {
70     cli_error('enginenotinstalled', 'search', $CFG->searchengine);
71 }
72 $serverstatus = $searchengine->is_server_ready();
73 if ($serverstatus !== true) {
74     cli_error($serverstatus);
75 }
77 $globalsearch = \core_search\manager::instance();
79 if (empty($options['reindex'])) {
80     if ($options['timelimit']) {
81         $limitinfo = ' (max ' . $options['timelimit'] . ' seconds)';
82         $limitunderline = preg_replace('~.~', '=', $limitinfo);
83         echo "Running index of site$limitinfo\n";
84         echo "=====================$limitunderline\n";
85         $timelimit = (int)$options['timelimit'];
86     } else {
87         echo "Running full index of site\n";
88         echo "==========================\n";
89         $timelimit = 0;
90     }
91     $before = time();
92     $globalsearch->index(false, $timelimit, new text_progress_trace());
94     // Do specific index requests with the remaining time.
95     if ($timelimit) {
96         $timelimit -= (time() - $before);
97         // Only do index requests if there is a reasonable amount of time left.
98         if ($timelimit > 1) {
99             $globalsearch->process_index_requests($timelimit, new text_progress_trace());
100         }
101     } else {
102         $globalsearch->process_index_requests(0, new text_progress_trace());
103     }
105 } else {
106     echo "Running full reindex of site\n";
107     echo "============================\n";
108     $globalsearch->index(true, 0, new text_progress_trace());
111 // Optimize index at last.
112 $globalsearch->optimize_index();