From 00c4fe63dc7b2abcf52f72ef6d20053fadb3872a Mon Sep 17 00:00:00 2001 From: cdujeu Date: Mon, 4 Jul 2016 12:57:27 +0200 Subject: [PATCH] Fix ShutdownScheduler that could skip deferred events when already in deferred loop. --- .../classes/class.AJXP_ShutdownScheduler.php | 45 +++++++++++-------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/core/src/core/classes/class.AJXP_ShutdownScheduler.php b/core/src/core/classes/class.AJXP_ShutdownScheduler.php index 21a5178b1c..8d9c575b45 100644 --- a/core/src/core/classes/class.AJXP_ShutdownScheduler.php +++ b/core/src/core/classes/class.AJXP_ShutdownScheduler.php @@ -81,24 +81,33 @@ public function registerShutdownEvent() $this->callbacks[] = $callback; return true; } - public function callRegisteredShutdown() - { - session_write_close(); + + public function callRegisteredShutdown() + { + session_write_close(); if (!headers_sent()) { - $size = ob_get_length(); - header("Connection: close\r\n"); - //header("Content-Encoding: none\r\n"); - header("Content-Length: $size"); - } + $size = ob_get_length(); + header("Connection: close\r\n"); + //header("Content-Encoding: none\r\n"); + header("Content-Length: $size"); + } ob_end_flush(); - flush(); - foreach ($this->callbacks as $arguments) { - $callback = array_shift($arguments); - try { - call_user_func_array($callback, $arguments); - } catch (Exception $e) { - AJXP_Logger::error(__CLASS__, __FUNCTION__, array("context"=>"Applying hook ".get_class($callback[0])."::".$callback[1], "message" => $e->getMessage())); - } - } - } + flush(); + $index = 0; + while (count($this->callbacks)) { + $arguments = array_shift($this->callbacks); + $callback = array_shift($arguments); + try { + call_user_func_array($callback, $arguments); + } catch (\Exception $e) { + AJXP_Logger::error(__CLASS__, __FUNCTION__, array("context" => "Applying hook " . get_class($callback[0]) . "::" . $callback[1], "message" => $e->getMessage())); + } + $index++; + if($index > 200) { + AJXP_Logger::error(__CLASS__, __FUNCTION__, "Breaking ShutdownScheduler loop, seems too big (200)"); + break; + } + } + } + }