PluginProbe
QuickWebP – WebP & AVIF Image Optimizer, Compression & SEO for WordPress / 4.1.2
QuickWebP – WebP & AVIF Image Optimizer, Compression & SEO for WordPress v4.1.2
4.1.2 4.1.1 4.1.0 4.0.1 4.0.0 3.3.1 3.3.0 trunk 1.0.0 2.0.0 2.1.0 3.0.0 3.1.0 3.2.0 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.2.7 3.2.8
← All changes | admin/class-cron-job.php +81 -11 4.0.14.1.2 View file →
@@ -56,10 +56,15 @@
56 56 /**
57 57 * excute bulk optimization
58 58 */
59 59 public function excute_bulk_optimization() {
60 - $time_start = microtime(true);
60 + $lock_token = $this->acquire_bulk_optimization_lock();
61 + if ( ! $lock_token ) {
62 + return;
63 + }
61 64
65 + $time_start = microtime( true );
66 +
62 67 $quickwebp_image_optimizer = new Quickwebp_Image_Optimizer( QUICKWEBP_TEXT_DOMAIN, QUICKWEBP_VERSION );
63 68 $settings = $quickwebp_image_optimizer->get_settings();
64 69
65 70 $mode_enabled = $settings['quickwebp_settings_conversion'];
@@ -64,25 +69,36 @@
64 69
65 70 $mode_enabled = $settings['quickwebp_settings_conversion'];
66 71 if ( '0' === $mode_enabled ) {
67 72 $this->end_cron_job();
73 + $this->release_bulk_optimization_lock( $lock_token );
74 + return;
68 75 }
69 76
70 - $media_ids = $quickwebp_image_optimizer->get_unoptimized_media_ids();
77 + $media_ids = $quickwebp_image_optimizer->get_unoptimized_media_ids( 5 );
71 78 if ( empty( $media_ids ) ) {
72 79 $this->end_cron_job();
80 + $this->release_bulk_optimization_lock( $lock_token );
81 + return;
73 82 }
74 83
75 84 $status = get_option( 'quickwebp_bulk_optimize_status', 'finish' );
76 85 if ( $status != 'running' ) {
77 86 $this->end_cron_job();
87 + $this->release_bulk_optimization_lock( $lock_token );
88 + return;
78 89 }
79 90
80 - $current = (int)get_option( 'quickwebp_bulk_optimize_current', 0 );
91 + $current = (int) get_option( 'quickwebp_bulk_optimize_current', 0 );
92 + $batch_stats = array(
93 + 'images_optimized' => 0,
94 + 'bytes_before' => 0,
95 + 'bytes_after' => 0,
96 + );
81 97
82 98 foreach ( $media_ids as $id ) {
83 - if ( $time_start + 55 < microtime(true) ) {
84 - exit;
99 + if ( $time_start + 55 < microtime( true ) ) {
100 + break;
85 101 }
86 102
87 103 $sizes = $quickwebp_image_optimizer->get_media_files( $id );
88 104 $new_sizes = array();
@@ -95,8 +111,12 @@
95 111 }
96 112 }
97 113
98 114 if ( ! empty( $new_sizes ) ) {
115 + $attachment_stats = $quickwebp_image_optimizer->get_attachment_optimization_stats( $new_sizes );
116 + $batch_stats['images_optimized'] += $attachment_stats['images_optimized'];
117 + $batch_stats['bytes_before'] += $attachment_stats['bytes_before'];
118 + $batch_stats['bytes_after'] += $attachment_stats['bytes_after'];
99 119
100 120 $data = get_post_meta( $id, 'quickwebp_data', true );
101 121 if ( ! empty( $data ) ) {
102 122 $quickwebp_image_optimizer->remove_related_files( $data );
@@ -116,15 +136,67 @@
116 136 delete_post_meta( $id, 'quickwebp_data' );
117 137 }
118 138
119 139 $current++;
120 - update_option( 'quickwebp_bulk_optimize_current', $current );
121 140 }
122 141
123 - $this->end_cron_job();
142 + if ( $batch_stats['images_optimized'] ) {
143 + $quickwebp_image_optimizer->record_optimization_stats(
144 + $batch_stats['bytes_before'],
145 + $batch_stats['bytes_after'],
146 + $batch_stats['images_optimized']
147 + );
148 + }
149 +
150 + update_option( 'quickwebp_bulk_optimize_current', $current );
151 +
152 + if ( empty( $quickwebp_image_optimizer->get_unoptimized_media_ids( 1 ) ) ) {
153 + $this->end_cron_job();
154 + }
155 +
156 + $this->release_bulk_optimization_lock( $lock_token );
124 157 }
125 158
126 159 /**
160 + * Acquire an expiring lock for the bulk optimization worker.
161 + *
162 + * @return string|false
163 + */
164 + private function acquire_bulk_optimization_lock() {
165 + $lock_token = wp_generate_uuid4();
166 + $lock = array(
167 + 'token' => $lock_token,
168 + 'expires' => time() + ( 2 * MINUTE_IN_SECONDS ),
169 + );
170 +
171 + if ( add_option( 'quickwebp_bulk_optimization_lock', $lock, '', false ) ) {
172 + return $lock_token;
173 + }
174 +
175 + $existing_lock = get_option( 'quickwebp_bulk_optimization_lock', array() );
176 + if ( is_array( $existing_lock ) && absint( $existing_lock['expires'] ?? 0 ) < time() ) {
177 + delete_option( 'quickwebp_bulk_optimization_lock' );
178 + if ( add_option( 'quickwebp_bulk_optimization_lock', $lock, '', false ) ) {
179 + return $lock_token;
180 + }
181 + }
182 +
183 + return false;
184 + }
185 +
186 + /**
187 + * Release the bulk optimization lock owned by this process.
188 + *
189 + * @param string $lock_token Lock ownership token.
190 + */
191 + private function release_bulk_optimization_lock( $lock_token ) {
192 + $lock = get_option( 'quickwebp_bulk_optimization_lock', array() );
193 + if ( is_array( $lock ) && hash_equals( (string) ( $lock['token'] ?? '' ), $lock_token ) ) {
194 + delete_option( 'quickwebp_bulk_optimization_lock' );
195 + }
196 + }
197 +
198 + /**
127 199 * Start bulk optimization
128 200 */
129 201 public function start_bulk_optimization() {
130 202
@@ -145,10 +217,10 @@
145 217 if ( '0' === $mode_enabled ) {
146 218 wp_send_json_error( __( 'Choose an image format and save the settings.', 'quickwebp' ) );
147 219 }
148 220
149 - $media_ids = $quickwebp_image_optimizer->get_unoptimized_media_ids();
150 - if ( empty( $media_ids ) ) {
221 + $total = $quickwebp_image_optimizer->get_unoptimized_media_count();
222 + if ( ! $total ) {
151 223 wp_send_json_error( __( 'No images to optimize.', 'quickwebp' ) );
152 224 }
153 225
154 226 $status = get_option( 'quickwebp_bulk_optimize_status', 'finish' );
@@ -158,9 +230,8 @@
158 230
159 231 if ( ! wp_next_scheduled( 'quickwebp_bulk_optimization_hook' ) ) {
160 232 wp_schedule_event( time(), 'bulk_optimization', 'quickwebp_bulk_optimization_hook' );
161 233
162 - $total = count( $media_ids );
163 234 $current = 0;
164 235
165 236 update_option( 'quickwebp_bulk_optimize_total', $total );
166 237 update_option( 'quickwebp_bulk_optimize_current', $current );
@@ -244,7 +315,6 @@
244 315 * End cron job
245 316 */
246 317 private function end_cron_job() {
247 318 $this->clear_bulk_optimization();
248 - exit;
249 319 }
250 320 }