PluginProbe ʕ •ᴥ•ʔ
NitroPack – Performance, Page Speed & Cache Plugin for Core Web Vitals, CDN & Image Optimization / 1.5.19
NitroPack – Performance, Page Speed & Cache Plugin for Core Web Vitals, CDN & Image Optimization v1.5.19
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 / Integration.php
nitropack / classes Last commit date
Integration 3 years ago WordPress 3 years ago Integration.php 3 years ago PluginStateHandler.php 4 years ago
Integration.php
193 lines
1 <?php
2
3 namespace NitroPack;
4
5 class Integration {
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/Server/LiteSpeed",
30 "NitroPack/Integration/Server/Fastly",
31 "NitroPack/Integration/Server/Cloudflare",
32 "NitroPack/Integration/Server/Sucuri",
33 "NitroPack/Integration/Plugin/NginxHelper",
34 "NitroPack/Integration/Plugin/Cloudflare",
35 "NitroPack/Integration/Plugin/ShortPixel",
36 "NitroPack/Integration/Plugin/WPCacheHelper",
37 "NitroPack/Integration/Plugin/CookieNotice",
38 "NitroPack/Integration/Plugin/BeaverBuilder",
39 "NitroPack/Integration/Plugin/FusionBuilder",
40 "NitroPack/Integration/Plugin/ThriveTheme",
41 "NitroPack/Integration/Plugin/AeliaCurrencySwitcher",
42 "NitroPack/Integration/Plugin/Woocommerce",
43 "NitroPack/Integration/Plugin/WoocommerceCacheHandler",
44 "NitroPack/Integration/Plugin/AdvancedMathCaptcha",
45 "NitroPack/Integration/Plugin/TheEventsCalendar",
46 ];
47 private static $loadedModules = [];
48 private static $stage = "very_early";
49 private $siteConfig = [];
50 private $purgeUrls = [];
51 private $fullPurge = false;
52
53 public static function getInstance() {
54 if (!self::$instance) {
55 self::$instance = new Integration();
56 }
57 return self::$instance;
58 }
59
60 public static function onCriticalInit($callback) {
61 if (!did_action(self::CRITICAL_INIT_ACTION)) {
62 add_action(self::CRITICAL_INIT_ACTION, $callback);
63 } else {
64 $callback();
65 }
66 }
67
68 public static function onShutdown($callback) {
69 self::$shutdownCallbacks[] = $callback;
70 }
71
72 public static function initSemAcquire() {
73 self::$criticalInitSemaphore++;
74 }
75
76 public static function initSemRelease() {
77 if (--self::$criticalInitSemaphore < 0) {
78 self::$criticalInitSemaphore = 0;
79 }
80 }
81
82 public function __construct() {
83 $this->siteConfig = nitropack_get_site_config();
84 }
85
86 public function getHosting() {
87 return $this->siteConfig && !empty($this->siteConfig["hosting"]) ? $this->siteConfig["hosting"] : "unknown";
88 }
89
90 public function init() {
91 if (self::$isInitialized) return true;
92
93 add_action( 'nitropack_integration_purge_url', [$this, "logUrlPurge"] );
94 add_action( 'nitropack_integration_purge_all', [$this, "logFullPurge"] );
95 self::onShutdown([$this, 'executeIntegrationPurges']);
96 register_shutdown_function(function() {
97 foreach (self::$shutdownCallbacks as $callback) {
98 $callback();
99 }
100 });
101
102 if ($this->siteConfig && !empty($this->siteConfig["isLateIntegrationInitRequired"])) {
103 self::initSemAcquire();
104 }
105
106 $this->initModules(); // very_early init
107
108 $action = $this->getSetupAction(); // can be muplugins_loaded or plugins_loaded
109 if (did_action($action)) {
110 $this->initModules();
111 } else {
112 add_action($action, [$this, 'initModules']);
113 }
114
115 if (did_action('plugins_loaded')) {
116 $this->lateInitModules();
117 } else {
118 add_action('plugins_loaded', [$this, 'lateInitModules']);
119 }
120
121 self::$isInitialized = true;
122 }
123
124 public function logUrlPurge($url) {
125 $this->purgeUrls[] = $url;
126 }
127
128 public function logFullPurge() {
129 $this->fullPurge = true;
130 }
131
132 public function initModules() {
133 if (!empty(self::$isInitializedStage[self::$stage])) return true;
134
135 foreach (self::$modules as $moduleName) {
136 $module = $this->loadModule($moduleName);
137 if ($module && $module->init(self::$stage)) {
138 // Modules which need to be initialized only once return NULL so they don't end up in this array
139 // This array holds only modules which need to have their init method called for each stage
140 self::$loadedModules[$moduleName] = $module;
141 }
142 }
143
144 self::$isInitializedStage[self::$stage] = true;
145
146 if (self::$criticalInitSemaphore < 1 && !did_action(self::CRITICAL_INIT_ACTION)) {
147 do_action(self::CRITICAL_INIT_ACTION);
148 }
149
150 if (self::$stage == "very_early") {
151 self::$stage = "early";
152 }
153 }
154
155 public function lateInitModules() {
156 self::$stage = "late";
157 if ($this->siteConfig && !empty($this->siteConfig["isLateIntegrationInitRequired"])) {
158 self::initSemRelease();
159 }
160 $this->initModules();
161 }
162
163 public function executeIntegrationPurges() {
164 if ($this->fullPurge) {
165 do_action("nitropack_execute_purge_all");
166 } else {
167 foreach (array_unique($this->purgeUrls) as $url) {
168 do_action("nitropack_execute_purge_url", $url);
169 }
170 }
171 }
172
173 private function loadModule($name) {
174 if (isset(self::$loadedModules[$name])) return self::$loadedModules[$name];
175
176 $class = str_replace("/", "\\", $name);
177 if ($class::STAGE == self::$stage) {
178 $module = new $class();
179 return $module;
180 } else {
181 return NULL;
182 }
183 }
184
185 private function getSetupAction() {
186 if ($this->siteConfig && !empty($this->siteConfig["isLateIntegrationInitRequired"])) {
187 return "plugins_loaded";
188 }
189
190 return "muplugins_loaded";
191 }
192 }
193