MDL-11160, Cron exhausts memory on "Removing expired enrolments ..." - changing nested foreach to JOINs with while(..rs_fetch_next_record).

This commit is contained in:
nfreear
2007-09-13 09:13:00 +00:00
parent 43ee1454df
commit c5898fad45
+16 -11
View File
@@ -152,18 +152,23 @@
mtrace('Removing expired enrolments ...', ''); // See MDL-8785
$timenow = time();
$somefound = false;
// The preferred way saves memory, dmllib.php
// find courses where limited enrolment is enabled
if($limitedcourses = get_records_select('course', 'enrolperiod > 0')) {
foreach($limitedcourses as $course) {
$context = get_context_instance(CONTEXT_COURSE, $course->id);
if ($oldenrolments = get_records_select('role_assignments', 'timeend > 0 AND timeend < ' . $timenow . ' AND contextid = ' . $context->id)) {
foreach ($oldenrolments as $oldenrolment) {
role_unassign($oldenrolment->roleid, $oldenrolment->userid, 0, $oldenrolment->contextid);
$somefound = true;
}
}
}
global $CFG;
$rs_enrol = get_recordset_sql("SELECT ra.roleid, ra.userid, ra.contextid
FROM {$CFG->prefix}course c
INNER JOIN {$CFG->prefix}context cx ON cx.instanceid = c.id
INNER JOIN {$CFG->prefix}role_assignments ra ON ra.contextid = cx.id
WHERE cx.contextlevel = '".CONTEXT_COURSE."'
AND ra.timeend > 0
AND ra.timeend < '$timenow'
AND c.enrolperiod > 0
");
while ($oldenrolment = rs_fetch_next_record($rs_enrol)) {
role_unassign($oldenrolment->roleid, $oldenrolment->userid, 0, $oldenrolment->contextid);
$somefound = true;
}
rs_close($rs_enrol);
if($somefound) {
mtrace('Done');
} else {
@@ -462,4 +467,4 @@
echo "</xmp>";
}
?>
?>