MDL-32214 quiz regrading: with many attempts, PHP runs out of memory
authorM Kassaei <m.kassaei@open.ac.uk>
Tue, 27 Mar 2012 13:23:05 +0000 (14:23 +0100)
committerDan Poltawski <dan@moodle.com>
Mon, 2 Apr 2012 03:04:05 +0000 (11:04 +0800)
mod/quiz/report/overview/report.php

index c7e2681..0b82f20 100644 (file)
@@ -374,6 +374,7 @@ class quiz_overview_report extends quiz_attempt_report {
      */
     protected function regrade_attempt($attempt, $dryrun = false, $slots = null) {
         global $DB;
      */
     protected function regrade_attempt($attempt, $dryrun = false, $slots = null) {
         global $DB;
+        set_time_limit(30);
 
         $transaction = $DB->start_delegated_transaction();
 
 
         $transaction = $DB->start_delegated_transaction();
 
@@ -406,6 +407,11 @@ class quiz_overview_report extends quiz_attempt_report {
         }
 
         $transaction->allow_commit();
         }
 
         $transaction->allow_commit();
+
+        // Really, PHP should not need this hint, but without this, we just run out of memory.
+        $quba = null;
+        $transaction = null;
+        gc_collect_cycles();
     }
 
     /**
     }
 
     /**
@@ -445,7 +451,6 @@ class quiz_overview_report extends quiz_attempt_report {
         $this->clear_regrade_table($quiz, $groupstudents);
 
         foreach ($attempts as $attempt) {
         $this->clear_regrade_table($quiz, $groupstudents);
 
         foreach ($attempts as $attempt) {
-            set_time_limit(30);
             $this->regrade_attempt($attempt, $dryrun);
         }
 
             $this->regrade_attempt($attempt, $dryrun);
         }
 
@@ -494,7 +499,6 @@ class quiz_overview_report extends quiz_attempt_report {
         $this->clear_regrade_table($quiz, $groupstudents);
 
         foreach ($attempts as $attempt) {
         $this->clear_regrade_table($quiz, $groupstudents);
 
         foreach ($attempts as $attempt) {
-            set_time_limit(30);
             $this->regrade_attempt($attempt, false, $attemptquestions[$attempt->uniqueid]);
         }
 
             $this->regrade_attempt($attempt, false, $attemptquestions[$attempt->uniqueid]);
         }