From b226c00e42b7c09afdff23a613a1bf86c7616b88 Mon Sep 17 00:00:00 2001 From: maxpozdeev Date: Mon, 5 Sep 2022 22:28:59 +0300 Subject: [PATCH] implement special notification didFinishRequest (useful for some post-processing in php-fpm) --- src/includes/notifications.php | 42 +++++++++++++++------------------- src/init.php | 2 +- 2 files changed, 19 insertions(+), 25 deletions(-) diff --git a/src/includes/notifications.php b/src/includes/notifications.php index 9f17547..86f5ca8 100644 --- a/src/includes/notifications.php +++ b/src/includes/notifications.php @@ -7,11 +7,6 @@ class MTTNotificationCenter */ private static $observers = []; - /** - * @var array - */ - private static $notificationStore = []; - /** * @param string $notification * @param MTTNotificationObserverInterface $observer @@ -22,7 +17,10 @@ class MTTNotificationCenter if (!isset(self::$observers[$notification])) { self::$observers[$notification] = []; } - self::$observers[$notification][] = $observer; + if (!in_array($observer, self::$observers[$notification])) { + // do not duplicate same observer + self::$observers[$notification][] = $observer; + } } /** @@ -40,35 +38,30 @@ class MTTNotificationCenter public static function postNotification(string $notification, $object) { - self::$notificationStore[] = [ - 'notification' => $notification, - 'object' => $object - ]; + if (!isset(self::$observers[$notification])) { + return; // No observers for this notification + } + foreach (self::$observers[$notification] as $observer) { + $observer->notification($notification, $object); + } } /** * Run this near exit() * @return void */ - public static function notifyDelayedObservers() + public static function postDidFinishRequestNotification() { - if (count(self::$notificationStore) == 0) { - return; // No notifications - } - if (session_status() == PHP_SESSION_ACTIVE) { - session_write_close(); // Close active session + if ( ! isset(self::$observers[MTTNotification::didFinishRequest]) ) { + return; // No observers for didFinishRequest } if (function_exists('fastcgi_finish_request')) { + if (session_status() == PHP_SESSION_ACTIVE) { + session_write_close(); // Close active session + } fastcgi_finish_request(); } - foreach (self::$notificationStore as $notificationItem) { - $notification = $notificationItem['notification']; - $object = $notificationItem['object']; - $observers = self::$observers[$notification] ?? []; - foreach ($observers as $observer) { - $observer->notification($notification, $object); - } - } + self::postNotification(MTTNotification::didFinishRequest, null); } } @@ -80,6 +73,7 @@ interface MTTNotificationObserverInterface // Enum abstract class MTTNotification { + const didFinishRequest = 'didFinishRequest'; const didCreateTask = 'didCreateTask'; const didCreateList = 'didCreateList'; } diff --git a/src/init.php b/src/init.php index 662a69d..e3e7ba5 100644 --- a/src/init.php +++ b/src/init.php @@ -323,7 +323,7 @@ function jsonExit($data) header('Pragma: no-cache'); // for old HTTP/1.0 intermediate caches header_remove('Expires'); echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); - MTTNotificationCenter::notifyDelayedObservers(); + MTTNotificationCenter::postDidFinishRequestNotification(); exit; }