diff --git a/lib/accesslib.php b/lib/accesslib.php index f9e4e71cfdd..dbb20318e70 100644 --- a/lib/accesslib.php +++ b/lib/accesslib.php @@ -572,8 +572,21 @@ function is_siteadmin($user_or_id = null) { $userid = $user_or_id; } + // Because this script is called many times (150+ for course page) with + // the same parameters, it is worth doing minor optimisations. This static + // cache stores the value for a single userid, saving about 2ms from course + // page load time without using significant memory. As the static cache + // also includes the value it depends on, this cannot break unit tests. + static $knownid, $knownresult, $knownsiteadmins; + if ($knownid === $userid && $knownsiteadmins === $CFG->siteadmins) { + return $knownresult; + } + $knownid = $userid; + $knownsiteadmins = $CFG->siteadmins; + $siteadmins = explode(',', $CFG->siteadmins); - return in_array($userid, $siteadmins); + $knownresult = in_array($userid, $siteadmins); + return $knownresult; } /** diff --git a/lib/tests/accesslib_test.php b/lib/tests/accesslib_test.php index 847724d754f..03a40c6e946 100644 --- a/lib/tests/accesslib_test.php +++ b/lib/tests/accesslib_test.php @@ -123,7 +123,7 @@ class accesslib_testcase extends advanced_testcase { * @return void */ public function test_is_siteadmin() { - global $DB; + global $DB, $CFG; $this->resetAfterTest(); @@ -145,6 +145,20 @@ class accesslib_testcase extends advanced_testcase { $this->assertFalse(is_siteadmin(null)); } } + + // Change the site admin list and check that it still works with + // multiple admins. We do this with userids only (not real user + // accounts) because it makes the test simpler. + $before = $CFG->siteadmins; + set_config('siteadmins', '666,667,668'); + $this->assertTrue(is_siteadmin(666)); + $this->assertTrue(is_siteadmin(667)); + $this->assertTrue(is_siteadmin(668)); + $this->assertFalse(is_siteadmin(669)); + set_config('siteadmins', '13'); + $this->assertTrue(is_siteadmin(13)); + $this->assertFalse(is_siteadmin(666)); + set_config('siteadmins', $before); } /**