Skip to content
Browse files

lib/setup moodelib: Introducing moodle_request_shutdown()

Now Moodle will have a 'shutdown_function' function. Right now
registered (and useful) only when running under apache + mod_php.

This initial function checks whether memory usage in this process exceeded
10MiB or $CFG->apachemaxmem (int, in bytes). This is really useful to prevent
using more RAM than we have.
  • Loading branch information...
1 parent 93cc66a commit bf01ed821166a95b59263f61e3ffd291b1bc3e1e martinlanghoff committed
Showing with 29 additions and 0 deletions.
  1. +25 −0 lib/moodlelib.php
  2. +4 −0 lib/setup.php
View
25 lib/moodlelib.php
@@ -6511,6 +6511,31 @@ function array_combine($keys, $values) {
');
}
+/*
+ * This function expects to called during shutdown
+ * should be set via register_shutdown_function()
+ * in lib/setup.php .
+ *
+ * Right now we do it only if we are under apache, to
+ * make sure apache children that hog too much mem are
+ * killed.
+ *
+ */
+function moodle_request_shutdown() {
+
+ // initially, we are only ever called under apache
+ // but check just in case
+ if (function_exists('apache_child_terminate') && function_exists('memory_get_usage')) {
+ if (empty($CFG->apachemaxmem)) {
+ $CFG->apachemaxmem = 10000000; // default 10MiB
+ }
+ if (memory_get_usage() > (int)$CFG->apachemaxmem) {
+ trigger_error('Mem usage over $CFG->apachemaxmem: marking child for reaping.');
+ apache_child_terminate();
+ }
+ }
+}
+
/**
* This function will make a complete copy of anything it's given,
* regardless of whether it's an object or not.
View
4 lib/setup.php
@@ -234,6 +234,10 @@
$originaldatabasedebug = -1;
}
+/// For now, only needed under apache (and probably unstable in other contexts)
+ if (function_exists('apache_child_terminate')) {
+ register_shutdown_function('moodle_request_shutdown');
+ }
//// Defining the site
if ($SITE = get_site()) {

0 comments on commit bf01ed8

Please sign in to comment.
Something went wrong with that request. Please try again.