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