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