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