PluginProbe ʕ •ᴥ•ʔ
NitroPack – Performance, Page Speed & Cache Plugin for Core Web Vitals, CDN & Image Optimization / 1.16.7
NitroPack – Performance, Page Speed & Cache Plugin for Core Web Vitals, CDN & Image Optimization v1.16.7
1.19.8 1.19.7 1.19.6 1.19.5 trunk 1.10.0 1.10.1 1.10.2 1.10.3 1.10.4 1.11.0 1.12.0 1.13.0 1.14.0 1.15.0 1.15.1 1.15.2 1.15.3 1.16.0 1.16.1 1.16.2 1.16.3 1.16.4 1.16.5 1.16.6 1.16.7 1.16.8 1.17.0 1.17.6 1.17.7 1.17.8 1.17.9 1.18.0 1.18.1 1.18.2 1.18.3 1.18.4 1.18.5 1.18.6 1.18.7 1.18.8 1.18.9 1.19.0 1.19.1 1.19.2 1.19.3 1.19.4 1.3.19 1.3.20 1.4.0 1.4.1 1.5.0 1.5.1 1.5.10 1.5.11 1.5.12 1.5.13 1.5.14 1.5.15 1.5.16 1.5.17 1.5.18 1.5.19 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.7.0 1.7.1 1.8.0 1.8.1 1.8.3 1.9.0 1.9.1 1.9.2
nitropack / classes / ModuleHandler.php
nitropack / classes Last commit date
Feature 1 year ago Integration 1 year ago Interfaces 2 years ago Util 2 years ago WordPress 1 year ago ModuleHandler.php 1 year ago PluginStateHandler.php 3 years ago
ModuleHandler.php
211 lines
1 <?php
2
3 namespace NitroPack;
4
5 class ModuleHandler {
6 const CRITICAL_INIT_ACTION = "nitropack_integration_critical_init";
7 public static $criticalInitSemaphore = 0;
8
9 private static $instance = NULL;
10 private static $purgeAllPending = false;
11 private static $purgeUrlPending = [];
12 private static $isInitialized = false;
13 private static $isInitializedStage = [];
14 private static $shutdownCallbacks = [];
15 private static $modules = [
16 "NitroPack/Integration/Hosting/Cloudways",
17 "NitroPack/Integration/Hosting/Flywheel",
18 "NitroPack/Integration/Hosting/WPEngine",
19 "NitroPack/Integration/Hosting/SiteGround",
20 "NitroPack/Integration/Hosting/GoDaddyWPaaS",
21 "NitroPack/Integration/Hosting/Kinsta",
22 "NitroPack/Integration/Hosting/Pagely",
23 "NitroPack/Integration/Hosting/Vimexx",
24 "NitroPack/Integration/Hosting/Pressable",
25 "NitroPack/Integration/Hosting/RocketNet",
26 "NitroPack/Integration/Hosting/Savvii",
27 "NitroPack/Integration/Hosting/DreamHost",
28 "NitroPack/Integration/Hosting/WPX",
29 "NitroPack/Integration/Hosting/WPmudev",
30 "NitroPack/Integration/Hosting/Raidboxes",
31 "NitroPack/Integration/Hosting/Pantheon",
32 "NitroPack/Integration/Hosting/SpinupWp",
33 "NitroPack/Integration/Server/LiteSpeed",
34 "NitroPack/Integration/Server/Fastly",
35 "NitroPack/Integration/Server/Cloudflare",
36 "NitroPack/Integration/Server/Sucuri",
37 "NitroPack/Integration/Server/NginxFastCgi",
38 "NitroPack/Integration/Plugin/NginxHelper",
39 "NitroPack/Integration/Plugin/Cloudflare",
40 "NitroPack/Integration/Plugin/ShortPixel",
41 "NitroPack/Integration/Plugin/WPCacheHelper",
42 "NitroPack/Integration/Plugin/CookieNotice",
43 "NitroPack/Integration/Plugin/BeaverBuilder",
44 "NitroPack/Integration/Plugin/FusionBuilder",
45 "NitroPack/Integration/Plugin/ThriveTheme",
46 "NitroPack/Integration/Plugin/AeliaCurrencySwitcher",
47 "NitroPack/Integration/Plugin/Woocommerce",
48 "NitroPack/Integration/Plugin/WoocommerceCacheHandler",
49 "NitroPack/Integration/Plugin/AdvancedMathCaptcha",
50 "NitroPack/Integration/Plugin/TheEventsCalendar",
51 "NitroPack/Integration/Plugin/WCML",
52 "NitroPack/Integration/Plugin/YoastSEO",
53 "NitroPack/Integration/Plugin/JetPackNP",
54 "NitroPack/Integration/Plugin/SquirrlySEO",
55 "NitroPack/Integration/Plugin/RankMathNP",
56 "NitroPack/Integration/Plugin/WPBakeryNP",
57 //"NitroPack/Integration/Plugin/GravityForms",
58 "NitroPack/Integration/Plugin/Elementor",
59 "NitroPack/Integration/Plugin/WPForms",
60 "NitroPack/Integration/Plugin/GeoTargetingWP",
61 "NitroPack/Integration/Plugin/WPML",
62 "NitroPack/Feature/SubrequestCache",
63 "NitroPack/Feature/AjaxShortcodes",
64 ];
65 private static $loadedModules = [];
66 private static $stage = "very_early";
67 private $siteConfig = [];
68 private $purgeUrls = [];
69 private $fullPurge = false;
70
71 public static function getInstance() {
72 if (!self::$instance) {
73 self::$instance = new ModuleHandler();
74 }
75 return self::$instance;
76 }
77
78 public static function onCriticalInit($callback) {
79 if (!did_action(self::CRITICAL_INIT_ACTION)) {
80 add_action(self::CRITICAL_INIT_ACTION, $callback);
81 } else {
82 $callback();
83 }
84 }
85
86 public static function onShutdown($callback) {
87 self::$shutdownCallbacks[] = $callback;
88 }
89
90 public static function initSemAcquire() {
91 self::$criticalInitSemaphore++;
92 }
93
94 public static function initSemRelease() {
95 if (--self::$criticalInitSemaphore < 0) {
96 self::$criticalInitSemaphore = 0;
97 }
98 }
99
100 public function __construct() {
101 $this->siteConfig = nitropack_get_site_config();
102 }
103
104 public function getHosting() {
105 return $this->siteConfig && !empty($this->siteConfig["hosting"]) ? $this->siteConfig["hosting"] : "unknown";
106 }
107
108 public function init() {
109 if (self::$isInitialized) return true;
110
111 add_action( 'nitropack_integration_purge_url', [$this, "logUrlPurge"] );
112 add_action( 'nitropack_integration_purge_all', [$this, "logFullPurge"] );
113 self::onShutdown([$this, 'executeIntegrationPurges']);
114 register_shutdown_function(function() {
115 foreach (self::$shutdownCallbacks as $callback) {
116 $callback();
117 }
118 });
119
120 if ($this->siteConfig && !empty($this->siteConfig["isLateIntegrationInitRequired"])) {
121 self::initSemAcquire();
122 }
123
124 $this->initModules(); // very_early init
125
126 $action = $this->getSetupAction(); // can be muplugins_loaded or plugins_loaded
127 if (did_action($action)) {
128 $this->initModules();
129 } else {
130 add_action($action, [$this, 'initModules']);
131 }
132
133 if (did_action('plugins_loaded')) {
134 $this->lateInitModules();
135 } else {
136 add_action('plugins_loaded', [$this, 'lateInitModules']);
137 }
138
139 self::$isInitialized = true;
140 }
141
142 public function logUrlPurge($url) {
143 $this->purgeUrls[] = $url;
144 }
145
146 public function logFullPurge() {
147 $this->fullPurge = true;
148 }
149
150 public function initModules() {
151 if (!empty(self::$isInitializedStage[self::$stage])) return true;
152
153 foreach (self::$modules as $moduleName) {
154 $module = $this->loadModule($moduleName);
155 if ($module && $module->init(self::$stage)) {
156 // Modules which need to be initialized only once return NULL so they don't end up in this array
157 // This array holds only modules which need to have their init method called for each stage
158 self::$loadedModules[$moduleName] = $module;
159 }
160 }
161
162 self::$isInitializedStage[self::$stage] = true;
163
164 if (self::$criticalInitSemaphore < 1 && !did_action(self::CRITICAL_INIT_ACTION)) {
165 do_action(self::CRITICAL_INIT_ACTION);
166 }
167
168 if (self::$stage == "very_early") {
169 self::$stage = "early";
170 }
171 }
172
173 public function lateInitModules() {
174 self::$stage = "late";
175 if ($this->siteConfig && !empty($this->siteConfig["isLateIntegrationInitRequired"])) {
176 self::initSemRelease();
177 }
178 $this->initModules();
179 }
180
181 public function executeIntegrationPurges() {
182 if ($this->fullPurge) {
183 do_action("nitropack_execute_purge_all");
184 } else {
185 foreach (array_unique($this->purgeUrls) as $url) {
186 do_action("nitropack_execute_purge_url", $url);
187 }
188 }
189 }
190
191 private function loadModule($name) {
192 if (isset(self::$loadedModules[$name])) return self::$loadedModules[$name];
193
194 $class = str_replace("/", "\\", $name);
195 if ($class::STAGE == self::$stage) {
196 $module = new $class();
197 return $module;
198 } else {
199 return NULL;
200 }
201 }
202
203 private function getSetupAction() {
204 if ($this->siteConfig && !empty($this->siteConfig["isLateIntegrationInitRequired"])) {
205 return "plugins_loaded";
206 }
207
208 return "muplugins_loaded";
209 }
210 }
211