$q = "INSERT INTO `$tb_url` SET url=%s";
$wpdb->query($wpdb->prepare($q, $request_url));
$url_id = $wpdb->insert_id;
$url_id = $url_row['id'];
$q = "SELECT * FROM `$tb_url_file` WHERE url_id=%d AND vary=%s AND type=%d AND expired=0";
$file_row = $wpdb->get_row($wpdb->prepare($q, array($url_id, $vary, $type)), ARRAY_A);
// Check if has previous file or not
if ($file_row && $file_row['filename'] == $filecon_md5) {
// If the new $filecon_md5 is marked as expired by previous records, clear those records
$q = "DELETE FROM `$tb_url_file` WHERE filename = %s AND expired > 0";
$wpdb->query($wpdb->prepare($q, $filecon_md5));
// Check if there is any other record used the same filename or not
$q = "SELECT id FROM `$tb_url_file` WHERE filename = %s AND expired = 0 AND id != %d LIMIT 1";
if ($file_row && $wpdb->get_var($wpdb->prepare($q, array($file_row['filename'], $file_row['id'])))) {
$q = "UPDATE `$tb_url_file` SET filename=%s WHERE id=%d";
$wpdb->query($wpdb->prepare($q, array($filecon_md5, $file_row['id'])));
$q = "INSERT INTO `$tb_url_file` SET url_id=%d, vary=%s, filename=%s, type=%d, mobile=%d, webp=%d, expired=0";
$wpdb->query($wpdb->prepare($q, array($url_id, $vary, $filecon_md5, $type, $mobile ? 1 : 0, $webp ? 1 : 0)));
// Mark existing rows as expired
$q = "UPDATE `$tb_url_file` SET expired=%d WHERE id=%d";
$expired = time() + 86400 * apply_filters('litespeed_url_file_expired_days', 20);
$wpdb->query($wpdb->prepare($q, array($expired, $file_row['id'])));
// Also check if has other files expired already to be deleted
$q = "SELECT * FROM `$tb_url_file` WHERE url_id = %d AND expired BETWEEN 1 AND %d";
$q = $wpdb->prepare($q, array($url_id, time()));
$list = $wpdb->get_results($q, ARRAY_A);
$file_to_del = $path . '/' . $v['filename'] . '.' . ($file_type == 'js' ? 'js' : 'css');
if (file_exists($file_to_del)) {
Debug2::debug('[Data] Delete expired unused file: ' . $file_to_del);
// Clear related lscache first to avoid cache copy of same URL w/ diff QS
// Purge::add( Tag::TYPE_MIN . '.' . $file_row[ 'filename' ] . '.' . $file_type );
$q = "DELETE FROM `$tb_url_file` WHERE url_id = %d AND expired BETWEEN 1 AND %d";
$wpdb->query($wpdb->prepare($q, array($url_id, time())));
// Purge this URL to avoid cache copy of same URL w/ diff QS
// $this->cls( 'Purge' )->purge_url( Utility::make_relative( $request_url ) ?: '/', true, true );
public function load_url_file($request_url, $vary, $file_type)
if (strlen($vary) > 32) {
$type = $this->_url_file_types[$file_type];
self::debug2('load url file: ' . $request_url);
$tb_url = $this->tb('url');
$q = "SELECT * FROM `$tb_url` WHERE url=%s";
$url_row = $wpdb->get_row($wpdb->prepare($q, $request_url), ARRAY_A);
$url_id = $url_row['id'];
$tb_url_file = $this->tb('url_file');
$q = "SELECT * FROM `$tb_url_file` WHERE url_id=%d AND vary=%s AND type=%d AND expired=0";
$file_row = $wpdb->get_row($wpdb->prepare($q, array($url_id, $vary, $type)), ARRAY_A);
return $file_row['filename'];
* Mark all entries of one URL to expired
public function mark_as_expired($request_url, $auto_q = false)
$tb_url = $this->tb('url');
Debug2::debug('[Data] Try to mark as expired: ' . $request_url);
$q = "SELECT * FROM `$tb_url` WHERE url=%s";
$url_row = $wpdb->get_row($wpdb->prepare($q, $request_url), ARRAY_A);
Debug2::debug('[Data] Mark url_id=' . $url_row['id'] . ' as expired');
$tb_url_file = $this->tb('url_file');
$existing_url_files = array();
$q = "SELECT a.*, b.url FROM `$tb_url_file` a LEFT JOIN `$tb_url` b ON b.id=a.url_id WHERE a.url_id=%d AND a.type=4 AND a.expired=0";
$q = $wpdb->prepare($q, $url_row['id']);
$existing_url_files = $wpdb->get_results($q, ARRAY_A);
$q = "UPDATE `$tb_url_file` SET expired=%d WHERE url_id=%d AND type=4 AND expired=0";
$expired = time() + 86400 * apply_filters('litespeed_url_file_expired_days', 20);
$wpdb->query($wpdb->prepare($q, array($expired, $url_row['id'])));
return $existing_url_files;
* Get list from `data/css_excludes.txt`
public function load_css_exc($list)
$data = $this->_load_per_line('css_excludes.txt');
$list = array_unique(array_filter(array_merge($list, $data)));
* Get list from `data/ucss_whitelist.txt`
public function load_ucss_whitelist($list)
$data = $this->_load_per_line('ucss_whitelist.txt');
$list = array_unique(array_filter(array_merge($list, $data)));
* Get list from `data/js_excludes.txt`
public function load_js_exc($list)
$data = $this->_load_per_line('js_excludes.txt');
$list = array_unique(array_filter(array_merge($list, $data)));
* Get list from `data/js_defer_excludes.txt`
public function load_js_defer_exc($list)
$data = $this->_load_per_line('js_defer_excludes.txt');
$list = array_unique(array_filter(array_merge($list, $data)));
* Get list from `data/optm_uri_exc.txt`
public function load_optm_uri_exc($list)
$data = $this->_load_per_line('optm_uri_exc.txt');
$list = array_unique(array_filter(array_merge($list, $data)));
* Get list from `data/esi.nonces.txt`
public function load_esi_nonces($list)
$data = $this->_load_per_line('esi.nonces.txt');
$list = array_unique(array_filter(array_merge($list, $data)));
* Get list from `data/cache_nocacheable.txt`
public function load_cache_nocacheable($list)
$data = $this->_load_per_line('cache_nocacheable.txt');
$list = array_unique(array_filter(array_merge($list, $data)));
* Support two kinds of comments:
private function _load_per_line($file)
$data = File::read(LSCWP_DIR . 'data/' . $file);
$data = explode(PHP_EOL, $data);
// Drop two kinds of comments
if (strpos($v, '##') !== false) {
$v = trim(substr($v, 0, strpos($v, '##')));
if (strpos($v, '# ') !== false) {
$v = trim(substr($v, 0, strpos($v, '# ')));