PluginProbe ʕ •ᴥ•ʔ
WP STAGING – WordPress Backups, Restore, Migration & Clone / 4.11.2
WP STAGING – WordPress Backups, Restore, Migration & Clone v4.11.2
4.11.2 4.11.1 4.11.0 4.10.0 4.9.5 4.9.4 4.9.3 4.9.2 4.9.1 4.9.0 4.8.1 trunk 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.10.0 3.2.0 3.3.1 3.3.2 3.3.3 3.4.1 3.4.3 3.5.0 3.6.0 3.7.1 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.8.6 3.8.7 3.9.0 3.9.1 3.9.2 3.9.3 3.9.4 4.0.0 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.0 4.7.0 4.7.1 4.7.2 4.7.3 4.8.0
wp-staging / Framework / Job / JobTransientCache.php
wp-staging / Framework / Job Last commit date
Ajax 6 days ago BackgroundProcessing 6 days ago Dto 6 days ago Exception 6 days ago Interfaces 2 weeks ago Jobs 2 weeks ago Task 1 week ago Traits 10 months ago AbstractJob.php 2 weeks ago JobProvider.php 2 weeks ago JobServiceProvider.php 6 days ago JobTransientCache.php 6 days ago ProcessLock.php 2 weeks ago
JobTransientCache.php
351 lines
1 <?php
2
3 namespace WPStaging\Framework\Job;
4
5
6
7
8
9 class JobTransientCache
10 {
11
12
13
14
15
16
17 const JOB_TRANSIENT_EXPIRY = 60 * 6;
18
19
20
21
22
23
24
25 const JOB_TRANSIENT_EXPIRY_ON_COMPLETE = 15;
26
27
28
29
30
31 const LAST_JOB_OUTCOME_EXPIRY = 5 * 60;
32
33
34
35
36
37 const TRANSIENT_CURRENT_JOB = 'wpstg_current_job';
38
39
40
41
42 const TRANSIENT_LAST_JOB_OUTCOME = 'wpstg_last_job_outcome';
43
44
45
46
47 const STATUS_RUNNING = 'running';
48
49
50
51
52 const STATUS_SUCCESS = 'success';
53
54
55
56
57 const STATUS_FAILED = 'failed';
58
59
60
61
62 const STATUS_CANCELLED = 'cancelled';
63
64
65
66
67 const STATUS_STALED = 'staled';
68
69
70
71
72 const SEVERITY_ERROR = 'error';
73
74
75
76
77
78 const SEVERITY_NOTICE = 'notice';
79
80
81
82
83 const JOB_TYPE_BACKUP = 'Backup';
84
85
86
87
88 const JOB_TYPE_RESTORE = 'Restore';
89
90
91
92
93 const JOB_TYPE_EXTRACT = 'Extract';
94
95
96
97
98 const JOB_TYPE_CANCEL = 'Cancel';
99
100
101
102
103 const JOB_TYPE_PLUGINS_UPDATER = 'Plugins_Updater';
104
105
106
107
108 const JOB_TYPE_STAGING_CREATE = 'Staging_Create';
109
110
111
112
113 const JOB_TYPE_STAGING_UPDATE = 'Staging_Update';
114
115
116
117
118 const JOB_TYPE_STAGING_RESET = 'Staging_Reset';
119
120
121
122
123 const JOB_TYPE_STAGING_PUSH = 'Staging_Push';
124
125
126
127
128 const JOB_TYPE_STAGING_DELETE = 'Staging_Delete';
129
130
131
132
133 const JOB_TYPE_PULL_PREPARE = 'Pull_Prepare';
134
135
136
137
138 const JOB_TYPE_PULL_RESTORE = 'Pull_Restore';
139
140
141
142
143 const JOB_TYPE_REMOTE_UPLOAD = 'Remote_Upload';
144
145
146
147
148 const CANCELABLE_JOBS = [
149 self::JOB_TYPE_BACKUP,
150 self::JOB_TYPE_RESTORE,
151 self::JOB_TYPE_EXTRACT,
152 self::JOB_TYPE_PULL_PREPARE,
153 self::JOB_TYPE_PULL_RESTORE,
154 self::JOB_TYPE_STAGING_CREATE,
155 self::JOB_TYPE_STAGING_UPDATE,
156 self::JOB_TYPE_STAGING_RESET,
157 self::JOB_TYPE_REMOTE_UPLOAD,
158 ];
159
160
161
162
163
164
165
166
167 public function startJob(string $jobId, string $jobTitle, string $jobType = 'job', string $queueId = '')
168 {
169 $jobData = [
170 'jobId' => $jobId,
171 'title' => $jobTitle,
172 'type' => $jobType,
173 'status' => self::STATUS_RUNNING,
174 'startedAt' => time(),
175 'updatedAt' => time(),
176 'queueId' => $queueId,
177 'message' => '',
178 ];
179
180 delete_transient(self::TRANSIENT_CURRENT_JOB);
181 set_transient(self::TRANSIENT_CURRENT_JOB, $jobData, self::JOB_TRANSIENT_EXPIRY);
182 }
183
184
185
186
187
188
189
190 public function markAsPreInitialized()
191 {
192 $jobData = $this->getJob();
193 if ($jobData === null) {
194 return;
195 }
196
197 $jobData['preInitAt'] = time();
198 delete_transient(self::TRANSIENT_CURRENT_JOB);
199 set_transient(self::TRANSIENT_CURRENT_JOB, $jobData, self::JOB_TRANSIENT_EXPIRY);
200 }
201
202
203
204
205
206 public function updateTitle(string $title)
207 {
208 $jobData = $this->getJob();
209 $jobData['title'] = $title;
210 $jobData['updatedAt'] = time();
211
212 set_transient(self::TRANSIENT_CURRENT_JOB, $jobData, self::JOB_TRANSIENT_EXPIRY);
213 }
214
215
216
217
218 public function completeJob()
219 {
220 $this->stopJob(self::STATUS_SUCCESS);
221 }
222
223
224
225
226 public function cancelJob(string $jobTitle)
227 {
228 $this->stopJob(self::STATUS_CANCELLED, $jobTitle);
229 }
230
231
232
233
234
235
236
237
238
239
240 public function failJob(string $title = '', string $message = '', string $severity = '')
241 {
242 $this->stopJob(self::STATUS_FAILED, $title, $message, $severity);
243 }
244
245
246
247
248 public function getJob()
249 {
250 $jobData = get_transient(self::TRANSIENT_CURRENT_JOB);
251 if (empty($jobData['jobId'])) {
252 return null;
253 }
254
255 return $jobData;
256 }
257
258 public function getJobId(): string
259 {
260 $jobData = $this->getJob();
261 if (empty($jobData['jobId'])) {
262 return '';
263 }
264
265 return $jobData['jobId'];
266 }
267
268 public function getJobStatus(): string
269 {
270 $jobData = $this->getJob();
271 if (empty($jobData['status'])) {
272 return '';
273 }
274
275 return $jobData['status'];
276 }
277
278
279
280
281
282 public function findJobById(string $jobId)
283 {
284 if ($jobId === '') {
285 return null;
286 }
287
288 $job = $this->getJob();
289 if (!empty($job['jobId']) && hash_equals((string) $job['jobId'], $jobId)) {
290 return $job;
291 }
292
293 $lastFinishedJob = get_transient(self::TRANSIENT_LAST_JOB_OUTCOME);
294 if (!empty($lastFinishedJob['jobId']) && hash_equals((string) $lastFinishedJob['jobId'], $jobId)) {
295 return $lastFinishedJob;
296 }
297
298 return null;
299 }
300
301
302
303
304 public function update()
305 {
306 $jobData = $this->getJob();
307 $jobData['updatedAt'] = time();
308
309 delete_transient(self::TRANSIENT_CURRENT_JOB);
310 set_transient(self::TRANSIENT_CURRENT_JOB, $jobData, self::JOB_TRANSIENT_EXPIRY);
311 }
312
313
314
315
316
317
318
319 private function stopJob(string $status, string $title = '', string $message = '', string $severity = '')
320 {
321 $jobData = $this->getJob();
322 $jobData['status'] = $status;
323 $jobData['updatedAt'] = time();
324 if (!empty($title)) {
325 $jobData['title'] = $title;
326 }
327
328 if (!empty($message)) {
329 $jobData['message'] = $message;
330 }
331
332
333
334
335
336 if ($severity !== '') {
337 $jobData['severity'] = $severity;
338 }
339
340
341 delete_transient(self::TRANSIENT_CURRENT_JOB);
342 set_transient(self::TRANSIENT_CURRENT_JOB, $jobData, self::JOB_TRANSIENT_EXPIRY_ON_COMPLETE);
343
344 if (empty($jobData['jobId'])) {
345 return;
346 }
347
348 set_transient(self::TRANSIENT_LAST_JOB_OUTCOME, $jobData, self::LAST_JOB_OUTCOME_EXPIRY);
349 }
350 }
351