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