MDL-62651 tool_task: Add adhoc CLI runner
[moodle.git] / admin / tool / task / cli / adhoc_task.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  * Task executor for adhoc tasks.
19  *
20  * @package    tool_task
21  * @copyright  2018 Andrew Nicols <andrew@nicols.co.uk>
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");
29 require_once("{$CFG->libdir}/cronlib.php");
31 list($options, $unrecognized) = cli_get_params(
32     [
33         'execute' => false,
34         'help' => false,
35         'showsql' => false,
36         'showdebugging' => false,
37     ], [
38         'h' => 'help',
39     ]
40 );
42 if ($unrecognized) {
43     $unrecognized = implode("\n  ", $unrecognized);
44     cli_error(get_string('cliunknowoption', 'admin', $unrecognized));
45 }
47 if ($options['help'] or empty($options['execute'])) {
48     $help =
49 "Scheduled cron tasks.
51 Options:
52 --showsql             Show sql queries before they are executed
53 --showdebugging       Show developer level debugging information
54 --execute             Run all queued adhoc tasks
55 -h, --help            Print out this help
57 Example:
58 \$sudo -u www-data /usr/bin/php admin/tool/task/cli/adhoc_task.php --execute
60 ";
62     echo $help;
63     die;
64 }
66 if ($options['showdebugging']) {
67     set_debugging(DEBUG_DEVELOPER, true);
68 }
70 if ($options['showsql']) {
71     $DB->set_debug(true);
72 }
74 if (CLI_MAINTENANCE) {
75     echo "CLI maintenance mode active, cron execution suspended.\n";
76     exit(1);
77 }
79 if (moodle_needs_upgrading()) {
80     echo "Moodle upgrade pending, cron execution suspended.\n";
81     exit(1);
82 }
84 if (empty($options['execute'])) {
85     exit(0);
86 }
88 if (!empty($CFG->showcronsql)) {
89     $DB->set_debug(true);
90 }
91 if (!empty($CFG->showcrondebugging)) {
92     set_debugging(DEBUG_DEVELOPER, true);
93 }
95 core_php_time_limit::raise();
96 $starttime = microtime();
98 // Increase memory limit.
99 raise_memory_limit(MEMORY_EXTRA);
101 // Emulate normal session - we use admin accoutn by default.
102 cron_setup_user();
104 // Start output log.
105 $timenow = time();
106 $humantimenow = date('r', $timenow);
107 mtrace("Server Time: {$humantimenow}\n");
109 // Run all adhoc tasks.
110 $taskcount = 0;
111 while (!\core\task\manager::static_caches_cleared_since($timenow) &&
112         $task = \core\task\manager::get_next_adhoc_task($timenow)) {
113     cron_run_inner_adhoc_task($task);
114     $taskcount++;
115     unset($task);
117 mtrace("Ran {$taskcount} adhoc tasks found at {$humantimenow}");