From 8231bb159b47cf7cf80e233071f03f153f4e0756 Mon Sep 17 00:00:00 2001 From: Eloy Lafuente Date: Mon, 15 Nov 2010 16:08:02 +0000 Subject: [PATCH] MDL-24962 backup - clean plan/settings circular refs on restore --- .../controller/restore_controller.class.php | 21 ++++++++++++++++++- backup/util/plan/restore_plan.class.php | 10 +++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/backup/controller/restore_controller.class.php b/backup/controller/restore_controller.class.php index 78fb4e67f3e..f08b09bb56f 100644 --- a/backup/controller/restore_controller.class.php +++ b/backup/controller/restore_controller.class.php @@ -135,6 +135,23 @@ class restore_controller extends backup implements loggable { } } + /** + * Clean structures used by the restore_controller + * + * This method clean various structures used by the restore_controller, + * destroying them in an ordered way, so their memory will be gc properly + * by PHP (mainly circular references). + * + * Note that, while it's not mandatory to execute this method, it's highly + * recommended to do so, specially in scripts performing multiple operations + * (like the automated backups) or the system will run out of memory after + * a few dozens of backups) + */ + public function destroy() { + // Only need to destroy circulars under the plan. Delegate to it. + $this->plan->destroy(); + } + public function finish_ui() { if ($this->status != backup::STATUS_SETTING_UI) { throw new restore_controller_exception('cannot_finish_ui_if_not_setting_ui'); @@ -157,7 +174,9 @@ class restore_controller extends backup implements loggable { // containing all the steps will be sent to DB. 100% (monster) useless. if ($status == backup::STATUS_AWAITING || $status == backup::STATUS_NEED_PRECHECK) { $this->save_controller(); - $this->logger = self::load_controller($this->restoreid)->logger; // wakeup loggers + $tbc = self::load_controller($this->restoreid); + $this->logger = $tbc->logger; // wakeup loggers + $tbc->destroy(); // Clean temp controller structures } } diff --git a/backup/util/plan/restore_plan.class.php b/backup/util/plan/restore_plan.class.php index e38ea45fc1c..27b1cfce2e4 100644 --- a/backup/util/plan/restore_plan.class.php +++ b/backup/util/plan/restore_plan.class.php @@ -59,6 +59,16 @@ class restore_plan extends base_plan implements loggable { parent::__construct('restore_plan'); } + /** + * Destroy all circular references. It helps PHP 5.2 a lot! + */ + public function destroy() { + // No need to destroy anything recursively here, direct reset + $this->controller = null; + // Delegate to base plan the rest + parent::destroy(); + } + public function build() { restore_plan_builder::build_plan($this->controller); // We are moodle2 always, go straight to builder $this->built = true;