MDL-62651 tool_task: Add adhoc CLI runner
authorAndrew Nicols <andrew@nicols.co.uk>
Wed, 6 Jun 2018 02:29:43 +0000 (10:29 +0800)
committerAndrew Nicols <andrew@nicols.co.uk>
Wed, 6 Jun 2018 03:48:37 +0000 (11:48 +0800)
admin/tool/task/cli/adhoc_task.php [new file with mode: 0644]

diff --git a/admin/tool/task/cli/adhoc_task.php b/admin/tool/task/cli/adhoc_task.php
new file mode 100644 (file)
index 0000000..f44f9d6
--- /dev/null
@@ -0,0 +1,117 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Task executor for adhoc tasks.
+ *
+ * @package    tool_task
+ * @copyright  2018 Andrew Nicols <andrew@nicols.co.uk>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+define('CLI_SCRIPT', true);
+
+require(__DIR__ . '/../../../../config.php');
+require_once("{$CFG->libdir}/clilib.php");
+require_once("{$CFG->libdir}/cronlib.php");
+
+list($options, $unrecognized) = cli_get_params(
+    [
+        'execute' => false,
+        'help' => false,
+        'showsql' => false,
+        'showdebugging' => false,
+    ], [
+        'h' => 'help',
+    ]
+);
+
+if ($unrecognized) {
+    $unrecognized = implode("\n  ", $unrecognized);
+    cli_error(get_string('cliunknowoption', 'admin', $unrecognized));
+}
+
+if ($options['help'] or empty($options['execute'])) {
+    $help =
+"Scheduled cron tasks.
+
+Options:
+--showsql             Show sql queries before they are executed
+--showdebugging       Show developer level debugging information
+--execute             Run all queued adhoc tasks
+-h, --help            Print out this help
+
+Example:
+\$sudo -u www-data /usr/bin/php admin/tool/task/cli/adhoc_task.php --execute
+
+";
+
+    echo $help;
+    die;
+}
+
+if ($options['showdebugging']) {
+    set_debugging(DEBUG_DEVELOPER, true);
+}
+
+if ($options['showsql']) {
+    $DB->set_debug(true);
+}
+
+if (CLI_MAINTENANCE) {
+    echo "CLI maintenance mode active, cron execution suspended.\n";
+    exit(1);
+}
+
+if (moodle_needs_upgrading()) {
+    echo "Moodle upgrade pending, cron execution suspended.\n";
+    exit(1);
+}
+
+if (empty($options['execute'])) {
+    exit(0);
+}
+
+if (!empty($CFG->showcronsql)) {
+    $DB->set_debug(true);
+}
+if (!empty($CFG->showcrondebugging)) {
+    set_debugging(DEBUG_DEVELOPER, true);
+}
+
+core_php_time_limit::raise();
+$starttime = microtime();
+
+// Increase memory limit.
+raise_memory_limit(MEMORY_EXTRA);
+
+// Emulate normal session - we use admin accoutn by default.
+cron_setup_user();
+
+// Start output log.
+$timenow = time();
+$humantimenow = date('r', $timenow);
+mtrace("Server Time: {$humantimenow}\n");
+
+// Run all adhoc tasks.
+$taskcount = 0;
+while (!\core\task\manager::static_caches_cleared_since($timenow) &&
+        $task = \core\task\manager::get_next_adhoc_task($timenow)) {
+    cron_run_inner_adhoc_task($task);
+    $taskcount++;
+    unset($task);
+}
+mtrace("Ran {$taskcount} adhoc tasks found at {$humantimenow}");