Edit File by line
/home/zeestwma/richards.../wp-conte.../plugins/litespee.../src
File: task.cls.php
<?php
[0] Fix | Delete
[1] Fix | Delete
/**
[2] Fix | Delete
* The cron task class.
[3] Fix | Delete
*
[4] Fix | Delete
* @since 1.1.3
[5] Fix | Delete
* @since 1.5 Moved into /inc
[6] Fix | Delete
*/
[7] Fix | Delete
[8] Fix | Delete
namespace LiteSpeed;
[9] Fix | Delete
[10] Fix | Delete
defined('WPINC') || exit();
[11] Fix | Delete
[12] Fix | Delete
class Task extends Root
[13] Fix | Delete
{
[14] Fix | Delete
const LOG_TAG = '⏰';
[15] Fix | Delete
private static $_triggers = array(
[16] Fix | Delete
Base::O_IMG_OPTM_CRON => array('name' => 'litespeed_task_imgoptm_pull', 'hook' => 'LiteSpeed\Img_Optm::start_async_cron'), // always fetch immediately
[17] Fix | Delete
Base::O_OPTM_CSS_ASYNC => array('name' => 'litespeed_task_ccss', 'hook' => 'LiteSpeed\CSS::cron_ccss'),
[18] Fix | Delete
Base::O_OPTM_UCSS => array('name' => 'litespeed_task_ucss', 'hook' => 'LiteSpeed\UCSS::cron'),
[19] Fix | Delete
Base::O_MEDIA_VPI_CRON => array('name' => 'litespeed_task_vpi', 'hook' => 'LiteSpeed\VPI::cron'),
[20] Fix | Delete
Base::O_MEDIA_PLACEHOLDER_RESP_ASYNC => array('name' => 'litespeed_task_lqip', 'hook' => 'LiteSpeed\Placeholder::cron'),
[21] Fix | Delete
Base::O_DISCUSS_AVATAR_CRON => array('name' => 'litespeed_task_avatar', 'hook' => 'LiteSpeed\Avatar::cron'),
[22] Fix | Delete
Base::O_IMG_OPTM_AUTO => array('name' => 'litespeed_task_imgoptm_req', 'hook' => 'LiteSpeed\Img_Optm::cron_auto_request'),
[23] Fix | Delete
Base::O_CRAWLER => array('name' => 'litespeed_task_crawler', 'hook' => 'LiteSpeed\Crawler::start_async_cron'), // Set crawler to last one to use above results
[24] Fix | Delete
);
[25] Fix | Delete
[26] Fix | Delete
private static $_guest_options = array(Base::O_OPTM_CSS_ASYNC, Base::O_OPTM_UCSS, Base::O_MEDIA_VPI);
[27] Fix | Delete
[28] Fix | Delete
const FILTER_CRAWLER = 'litespeed_crawl_filter';
[29] Fix | Delete
const FILTER = 'litespeed_filter';
[30] Fix | Delete
[31] Fix | Delete
/**
[32] Fix | Delete
* Keep all tasks in cron
[33] Fix | Delete
*
[34] Fix | Delete
* @since 3.0
[35] Fix | Delete
* @access public
[36] Fix | Delete
*/
[37] Fix | Delete
public function init()
[38] Fix | Delete
{
[39] Fix | Delete
self::debug2('Init');
[40] Fix | Delete
add_filter('cron_schedules', array($this, 'lscache_cron_filter'));
[41] Fix | Delete
[42] Fix | Delete
$guest_optm = $this->conf(Base::O_GUEST) && $this->conf(Base::O_GUEST_OPTM);
[43] Fix | Delete
[44] Fix | Delete
foreach (self::$_triggers as $id => $trigger) {
[45] Fix | Delete
if (!$this->conf($id)) {
[46] Fix | Delete
if (!$guest_optm || !in_array($id, self::$_guest_options)) {
[47] Fix | Delete
continue;
[48] Fix | Delete
}
[49] Fix | Delete
}
[50] Fix | Delete
[51] Fix | Delete
// Special check for crawler
[52] Fix | Delete
if ($id == Base::O_CRAWLER) {
[53] Fix | Delete
if (!Router::can_crawl()) {
[54] Fix | Delete
continue;
[55] Fix | Delete
}
[56] Fix | Delete
[57] Fix | Delete
add_filter('cron_schedules', array($this, 'lscache_cron_filter_crawler'));
[58] Fix | Delete
}
[59] Fix | Delete
[60] Fix | Delete
if (!wp_next_scheduled($trigger['name'])) {
[61] Fix | Delete
self::debug('Cron hook register [name] ' . $trigger['name']);
[62] Fix | Delete
[63] Fix | Delete
wp_schedule_event(time(), $id == Base::O_CRAWLER ? self::FILTER_CRAWLER : self::FILTER, $trigger['name']);
[64] Fix | Delete
}
[65] Fix | Delete
[66] Fix | Delete
add_action($trigger['name'], $trigger['hook']);
[67] Fix | Delete
}
[68] Fix | Delete
}
[69] Fix | Delete
[70] Fix | Delete
/**
[71] Fix | Delete
* Handle all async noabort requests
[72] Fix | Delete
*
[73] Fix | Delete
* @since 5.5
[74] Fix | Delete
*/
[75] Fix | Delete
public static function async_litespeed_handler()
[76] Fix | Delete
{
[77] Fix | Delete
$hash_data = self::get_option('async_call-hash', array());
[78] Fix | Delete
if (!$hash_data || !is_array($hash_data) || empty($hash_data['hash']) || empty($hash_data['ts'])) {
[79] Fix | Delete
self::debug('async_litespeed_handler no hash data', $hash_data);
[80] Fix | Delete
return;
[81] Fix | Delete
}
[82] Fix | Delete
if (time() - $hash_data['ts'] > 120 || empty($_GET['nonce']) || $_GET['nonce'] != $hash_data['hash']) {
[83] Fix | Delete
self::debug('async_litespeed_handler nonce mismatch');
[84] Fix | Delete
return;
[85] Fix | Delete
}
[86] Fix | Delete
self::delete_option('async_call-hash');
[87] Fix | Delete
[88] Fix | Delete
$type = Router::verify_type();
[89] Fix | Delete
self::debug('type=' . $type);
[90] Fix | Delete
[91] Fix | Delete
// Don't lock up other requests while processing
[92] Fix | Delete
session_write_close();
[93] Fix | Delete
switch ($type) {
[94] Fix | Delete
case 'crawler':
[95] Fix | Delete
Crawler::async_handler();
[96] Fix | Delete
break;
[97] Fix | Delete
case 'crawler_force':
[98] Fix | Delete
Crawler::async_handler(true);
[99] Fix | Delete
break;
[100] Fix | Delete
case 'imgoptm':
[101] Fix | Delete
Img_Optm::async_handler();
[102] Fix | Delete
break;
[103] Fix | Delete
case 'imgoptm_force':
[104] Fix | Delete
Img_Optm::async_handler(true);
[105] Fix | Delete
break;
[106] Fix | Delete
default:
[107] Fix | Delete
}
[108] Fix | Delete
}
[109] Fix | Delete
[110] Fix | Delete
/**
[111] Fix | Delete
* Async caller wrapper func
[112] Fix | Delete
*
[113] Fix | Delete
* @since 5.5
[114] Fix | Delete
*/
[115] Fix | Delete
public static function async_call($type)
[116] Fix | Delete
{
[117] Fix | Delete
$hash = Str::rrand(32);
[118] Fix | Delete
self::update_option('async_call-hash', array('hash' => $hash, 'ts' => time()));
[119] Fix | Delete
$args = array(
[120] Fix | Delete
'timeout' => 0.01,
[121] Fix | Delete
'blocking' => false,
[122] Fix | Delete
'sslverify' => false,
[123] Fix | Delete
// 'cookies' => $_COOKIE,
[124] Fix | Delete
);
[125] Fix | Delete
$qs = array(
[126] Fix | Delete
'action' => 'async_litespeed',
[127] Fix | Delete
'nonce' => $hash,
[128] Fix | Delete
Router::TYPE => $type,
[129] Fix | Delete
);
[130] Fix | Delete
$url = add_query_arg($qs, admin_url('admin-ajax.php'));
[131] Fix | Delete
self::debug('async call to ' . $url);
[132] Fix | Delete
wp_remote_post(esc_url_raw($url), $args);
[133] Fix | Delete
}
[134] Fix | Delete
[135] Fix | Delete
/**
[136] Fix | Delete
* Clean all potential existing crons
[137] Fix | Delete
*
[138] Fix | Delete
* @since 3.0
[139] Fix | Delete
* @access public
[140] Fix | Delete
*/
[141] Fix | Delete
public static function destroy()
[142] Fix | Delete
{
[143] Fix | Delete
Utility::compatibility();
[144] Fix | Delete
array_map('wp_clear_scheduled_hook', array_column(self::$_triggers, 'name'));
[145] Fix | Delete
}
[146] Fix | Delete
[147] Fix | Delete
/**
[148] Fix | Delete
* Try to clean the crons if disabled
[149] Fix | Delete
*
[150] Fix | Delete
* @since 3.0
[151] Fix | Delete
* @access public
[152] Fix | Delete
*/
[153] Fix | Delete
public function try_clean($id)
[154] Fix | Delete
{
[155] Fix | Delete
// Clean v2's leftover cron ( will remove in v3.1 )
[156] Fix | Delete
// foreach ( wp_get_ready_cron_jobs() as $hooks ) {
[157] Fix | Delete
// foreach ( $hooks as $hook => $v ) {
[158] Fix | Delete
// if ( strpos( $hook, 'litespeed_' ) === 0 && ( substr( $hook, -8 ) === '_trigger' || strpos( $hook, 'litespeed_task_' ) !== 0 ) ) {
[159] Fix | Delete
// self::debug( 'Cron clear legacy [hook] ' . $hook );
[160] Fix | Delete
// wp_clear_scheduled_hook( $hook );
[161] Fix | Delete
// }
[162] Fix | Delete
// }
[163] Fix | Delete
// }
[164] Fix | Delete
[165] Fix | Delete
if ($id && !empty(self::$_triggers[$id])) {
[166] Fix | Delete
if (!$this->conf($id) || ($id == Base::O_CRAWLER && !Router::can_crawl())) {
[167] Fix | Delete
self::debug('Cron clear [id] ' . $id . ' [hook] ' . self::$_triggers[$id]['name']);
[168] Fix | Delete
wp_clear_scheduled_hook(self::$_triggers[$id]['name']);
[169] Fix | Delete
}
[170] Fix | Delete
return;
[171] Fix | Delete
}
[172] Fix | Delete
[173] Fix | Delete
self::debug('❌ Unknown cron [id] ' . $id);
[174] Fix | Delete
}
[175] Fix | Delete
[176] Fix | Delete
/**
[177] Fix | Delete
* Register cron interval imgoptm
[178] Fix | Delete
*
[179] Fix | Delete
* @since 1.6.1
[180] Fix | Delete
* @access public
[181] Fix | Delete
*/
[182] Fix | Delete
public function lscache_cron_filter($schedules)
[183] Fix | Delete
{
[184] Fix | Delete
if (!array_key_exists(self::FILTER, $schedules)) {
[185] Fix | Delete
$schedules[self::FILTER] = array(
[186] Fix | Delete
'interval' => 60,
[187] Fix | Delete
'display' => __('Every Minute', 'litespeed-cache'),
[188] Fix | Delete
);
[189] Fix | Delete
}
[190] Fix | Delete
return $schedules;
[191] Fix | Delete
}
[192] Fix | Delete
[193] Fix | Delete
/**
[194] Fix | Delete
* Register cron interval
[195] Fix | Delete
*
[196] Fix | Delete
* @since 1.1.0
[197] Fix | Delete
* @access public
[198] Fix | Delete
*/
[199] Fix | Delete
public function lscache_cron_filter_crawler($schedules)
[200] Fix | Delete
{
[201] Fix | Delete
$interval = $this->conf(Base::O_CRAWLER_RUN_INTERVAL);
[202] Fix | Delete
// $wp_schedules = wp_get_schedules();
[203] Fix | Delete
if (!array_key_exists(self::FILTER_CRAWLER, $schedules)) {
[204] Fix | Delete
// self::debug('Crawler cron log: cron filter '.$interval.' added');
[205] Fix | Delete
$schedules[self::FILTER_CRAWLER] = array(
[206] Fix | Delete
'interval' => $interval,
[207] Fix | Delete
'display' => __('LiteSpeed Crawler Cron', 'litespeed-cache'),
[208] Fix | Delete
);
[209] Fix | Delete
}
[210] Fix | Delete
return $schedules;
[211] Fix | Delete
}
[212] Fix | Delete
}
[213] Fix | Delete
[214] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function