Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.
   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/>.
  16  
  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   */
  24  
  25  define('CLI_SCRIPT', true);
  26  
  27  require(__DIR__.'/../../config.php');
  28  require_once($CFG->libdir.'/clilib.php');      // cli only functions
  29  
  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'));
  33  
  34  if ($unrecognized) {
  35      $unrecognized = implode("\n  ", $unrecognized);
  36      cli_error(get_string('cliunknowoption', 'admin', $unrecognized));
  37  }
  38  
  39  if ($options['help']) {
  40      $help =
  41  "Index search data
  42  
  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)
  48  
  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  ";
  53  
  54      echo $help;
  55      die;
  56  }
  57  
  58  if ($options['timelimit'] && $options['reindex']) {
  59      cli_error('Cannot apply time limit when reindexing');
  60  }
  61  
  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  }
  65  
  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  }
  76  
  77  $globalsearch = \core_search\manager::instance();
  78  
  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());
  93  
  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      }
 104  
 105  } else {
 106      echo "Running full reindex of site\n";
 107      echo "============================\n";
 108      $globalsearch->index(true, 0, new text_progress_trace());
 109  }
 110  
 111  // Optimize index at last.
 112  $globalsearch->optimize_index();