PluginProbe ʕ •ᴥ•ʔ
NitroPack – Performance, Page Speed & Cache Plugin for Core Web Vitals, CDN & Image Optimization / 1.16.0
NitroPack – Performance, Page Speed & Cache Plugin for Core Web Vitals, CDN & Image Optimization v1.16.0
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 2 years ago Interfaces 2 years ago Util 2 years ago WordPress 2 years ago ModuleHandler.php 2 years ago PluginStateHandler.php 3 years ago
ModuleHandler.php
210 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/Feature/SubrequestCache",
62 "NitroPack/Feature/AjaxShortcodes",
63 ];
64 private static $loadedModules = [];
65 private static $stage = "very_early";
66 private $siteConfig = [];
67 private $purgeUrls = [];
68 private $fullPurge = false;
69
70 public static function getInstance() {
71 if (!self::$instance) {
72 self::$instance = new ModuleHandler();
73 }
74 return self::$instance;
75 }
76
77 public static function onCriticalInit($callback) {
78 if (!did_action(self::CRITICAL_INIT_ACTION)) {
79 add_action(self::CRITICAL_INIT_ACTION, $callback);
80 } else {
81 $callback();
82 }
83 }
84
85 public static function onShutdown($callback) {
86 self::$shutdownCallbacks[] = $callback;
87 }
88
89 public static function initSemAcquire() {
90 self::$criticalInitSemaphore++;
91 }
92
93 public static function initSemRelease() {
94 if (--self::$criticalInitSemaphore < 0) {
95 self::$criticalInitSemaphore = 0;
96 }
97 }
98
99 public function __construct() {
100 $this->siteConfig = nitropack_get_site_config();
101 }
102
103 public function getHosting() {
104 return $this->siteConfig && !empty($this->siteConfig["hosting"]) ? $this->siteConfig["hosting"] : "unknown";
105 }
106
107 public function init() {
108 if (self::$isInitialized) return true;
109
110 add_action( 'nitropack_integration_purge_url', [$this, "logUrlPurge"] );
111 add_action( 'nitropack_integration_purge_all', [$this, "logFullPurge"] );
112 self::onShutdown([$this, 'executeIntegrationPurges']);
113 register_shutdown_function(function() {
114 foreach (self::$shutdownCallbacks as $callback) {
115 $callback();
116 }
117 });
118
119 if ($this->siteConfig && !empty($this->siteConfig["isLateIntegrationInitRequired"])) {
120 self::initSemAcquire();
121 }
122
123 $this->initModules(); // very_early init
124
125 $action = $this->getSetupAction(); // can be muplugins_loaded or plugins_loaded
126 if (did_action($action)) {
127 $this->initModules();
128 } else {
129 add_action($action, [$this, 'initModules']);
130 }
131
132 if (did_action('plugins_loaded')) {
133 $this->lateInitModules();
134 } else {
135 add_action('plugins_loaded', [$this, 'lateInitModules']);
136 }
137
138 self::$isInitialized = true;
139 }
140
141 public function logUrlPurge($url) {
142 $this->purgeUrls[] = $url;
143 }
144
145 public function logFullPurge() {
146 $this->fullPurge = true;
147 }
148
149 public function initModules() {
150 if (!empty(self::$isInitializedStage[self::$stage])) return true;
151
152 foreach (self::$modules as $moduleName) {
153 $module = $this->loadModule($moduleName);
154 if ($module && $module->init(self::$stage)) {
155 // Modules which need to be initialized only once return NULL so they don't end up in this array
156 // This array holds only modules which need to have their init method called for each stage
157 self::$loadedModules[$moduleName] = $module;
158 }
159 }
160
161 self::$isInitializedStage[self::$stage] = true;
162
163 if (self::$criticalInitSemaphore < 1 && !did_action(self::CRITICAL_INIT_ACTION)) {
164 do_action(self::CRITICAL_INIT_ACTION);
165 }
166
167 if (self::$stage == "very_early") {
168 self::$stage = "early";
169 }
170 }
171
172 public function lateInitModules() {
173 self::$stage = "late";
174 if ($this->siteConfig && !empty($this->siteConfig["isLateIntegrationInitRequired"])) {
175 self::initSemRelease();
176 }
177 $this->initModules();
178 }
179
180 public function executeIntegrationPurges() {
181 if ($this->fullPurge) {
182 do_action("nitropack_execute_purge_all");
183 } else {
184 foreach (array_unique($this->purgeUrls) as $url) {
185 do_action("nitropack_execute_purge_url", $url);
186 }
187 }
188 }
189
190 private function loadModule($name) {
191 if (isset(self::$loadedModules[$name])) return self::$loadedModules[$name];
192
193 $class = str_replace("/", "\\", $name);
194 if ($class::STAGE == self::$stage) {
195 $module = new $class();
196 return $module;
197 } else {
198 return NULL;
199 }
200 }
201
202 private function getSetupAction() {
203 if ($this->siteConfig && !empty($this->siteConfig["isLateIntegrationInitRequired"])) {
204 return "plugins_loaded";
205 }
206
207 return "muplugins_loaded";
208 }
209 }
210