PluginProbe ʕ •ᴥ•ʔ
WP STAGING – WordPress Backup, Restore, Migration & Clone / 4.3.0
WP STAGING – WordPress Backup, Restore, Migration & Clone v4.3.0
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 10 months ago BackgroundProcessing 1 year ago Dto 11 months ago Exception 11 months ago Interfaces 11 months ago Jobs 10 months ago Task 10 months ago AbstractJob.php 10 months ago JobProvider.php 1 year ago JobServiceProvider.php 10 months ago JobTransientCache.php 11 months ago ProcessLock.php 1 year ago
JobTransientCache.php
212 lines
1 <?php
2
3 namespace WPStaging\Framework\Job;
4
5 /**
6 * It is used to cache the current running job data in a transient.
7 * So it can be used for BackgroundLogger to push the events to the SSE stream.
8 */
9 class JobTransientCache
10 {
11 /**
12 * This is the time in seconds that the job transient will be kept.
13 * This is used to show the current job status in the UI.
14 * @var int
15 */
16 const JOB_TRANSIENT_EXPIRY = 60 * 60 * 6; // 6 hours
17
18 /**
19 * This is the time in seconds that the job transient will be kept after the job is completed.
20 * Instead of deleting the transient immediately, we reduce it expiry to 15 seconds, to every open SSE stream
21 * can get the latest status of the job.
22 * @var int
23 */
24 const JOB_TRANSIENT_EXPIRY_ON_COMPLETE = 15;
25
26 /**
27 * This is the transient key that will be used to store the current job data.
28 * @var string
29 */
30 const TRANSIENT_CURRENT_JOB = 'wpstg_current_job';
31
32 /**
33 * @var string
34 */
35 const STATUS_RUNNING = 'running';
36
37 /**
38 * @var string
39 */
40 const STATUS_SUCCESS = 'success';
41
42 /**
43 * @var string
44 */
45 const STATUS_FAILED = 'failed';
46
47 /**
48 * @var string
49 */
50 const STATUS_CANCELLED = 'cancelled';
51
52 /**
53 * @var string
54 */
55 const JOB_TYPE_BACKUP = 'Backup';
56
57 /**
58 * @var string
59 */
60 const JOB_TYPE_RESTORE = 'Restore';
61
62 /**
63 * @var string
64 */
65 const JOB_TYPE_CANCEL = 'Cancel';
66
67 /**
68 * @var string
69 */
70 const JOB_TYPE_PLUGINS_UPDATER = 'Plugins_Updater';
71
72 /**
73 * @var string
74 */
75 const JOB_TYPE_STAGING_CREATE = 'Staging_Create';
76
77 /**
78 * @var string
79 */
80 const JOB_TYPE_STAGING_DELETE = 'Staging_Delete';
81
82 /**
83 * @var string
84 */
85 const JOB_TYPE_PULL_PREPARE = 'Pull_Prepare';
86
87 /**
88 * @var string
89 */
90 const JOB_TYPE_PULL_RESTORE = 'Pull_Restore';
91
92 /**
93 * @var string[]
94 */
95 const CANCELABLE_JOBS = [
96 self::JOB_TYPE_BACKUP,
97 self::JOB_TYPE_RESTORE,
98 self::JOB_TYPE_PULL_PREPARE,
99 self::JOB_TYPE_PULL_RESTORE,
100 self::JOB_TYPE_STAGING_CREATE,
101 ];
102
103 /**
104 * @param string $jobId
105 * @param string $jobTitle
106 * @param string $jobType
107 * @param string $queueId
108 * @return void
109 */
110 public function startJob(string $jobId, string $jobTitle, string $jobType = 'job', string $queueId = '')
111 {
112 $jobData = [
113 'jobId' => $jobId,
114 'title' => $jobTitle,
115 'type' => $jobType,
116 'status' => self::STATUS_RUNNING,
117 'start' => time(),
118 'queueId' => $queueId,
119 ];
120
121 delete_transient(self::TRANSIENT_CURRENT_JOB);
122 set_transient(self::TRANSIENT_CURRENT_JOB, $jobData, self::JOB_TRANSIENT_EXPIRY);
123 }
124
125 /**
126 * @param string $title
127 * @return void
128 */
129 public function updateTitle(string $title)
130 {
131 $jobData = $this->getJob();
132 $jobData['title'] = $title;
133
134 set_transient(self::TRANSIENT_CURRENT_JOB, $jobData, self::JOB_TRANSIENT_EXPIRY);
135 }
136
137 /**
138 * @return void
139 */
140 public function completeJob()
141 {
142 $this->stopJob(self::STATUS_SUCCESS);
143 }
144
145 /**
146 * @return void
147 */
148 public function cancelJob(string $jobTitle)
149 {
150 $this->stopJob(self::STATUS_CANCELLED, $jobTitle);
151 }
152
153 /**
154 * @return void
155 */
156 public function failJob()
157 {
158 $this->stopJob(self::STATUS_FAILED);
159 }
160
161 /**
162 * @return array|null
163 */
164 public function getJob()
165 {
166 $jobData = get_transient(self::TRANSIENT_CURRENT_JOB);
167 if (empty($jobData['jobId'])) {
168 return null;
169 }
170
171 return $jobData;
172 }
173
174 public function getJobId(): string
175 {
176 $jobData = $this->getJob();
177 if (empty($jobData['jobId'])) {
178 return '';
179 }
180
181 return $jobData['jobId'];
182 }
183
184 public function getJobStatus(): string
185 {
186 $jobData = $this->getJob();
187 if (empty($jobData['status'])) {
188 return '';
189 }
190
191 return $jobData['status'];
192 }
193
194 /**
195 * @param string $status
196 * @param string $title
197 * @return void
198 */
199 private function stopJob(string $status, string $title = '')
200 {
201 $jobData = $this->getJob();
202 $jobData['status'] = $status;
203 if (!empty($title)) {
204 $jobData['title'] = $title;
205 }
206
207 // This will make sure to update the expiry as well if the status was already the same!
208 delete_transient(self::TRANSIENT_CURRENT_JOB);
209 set_transient(self::TRANSIENT_CURRENT_JOB, $jobData, self::JOB_TRANSIENT_EXPIRY_ON_COMPLETE);
210 }
211 }
212