* The import/export class.
defined('WPINC') || exit();
class Import extends Base {
const TYPE_IMPORT = 'import';
const TYPE_EXPORT = 'export';
const TYPE_RESET = 'reset';
public function __construct() {
Debug2::debug('Import init');
$this->_summary = self::get_summary();
* Export settings to file
* @since 7.3 added download content type
public function export( $only_data_return = false ) {
$raw_data = $this->get_options(true);
foreach ($raw_data as $k => $v) {
$data[] = \json_encode(array( $k, $v ));
$data = implode("\n\n", $data);
$filename = $this->_generate_filename();
$this->_summary['export_file'] = $filename;
$this->_summary['export_time'] = time();
Debug2::debug('Import: Saved to ' . $filename);
@header('Content-Type: application/octet-stream');
@header('Content-Disposition: attachment; filename=' . $filename);
* Import settings from file
public function import( $file = false ) {
if (empty($_FILES['ls_file']['name']) || substr($_FILES['ls_file']['name'], -5) != '.data' || empty($_FILES['ls_file']['tmp_name'])) {
Debug2::debug('Import: Failed to import, wrong ls_file');
$msg = __('Import failed due to file error.', 'litespeed-cache');
Admin_Display::error($msg);
$this->_summary['import_file'] = $_FILES['ls_file']['name'];
$data = file_get_contents($_FILES['ls_file']['tmp_name']);
$this->_summary['import_file'] = $file;
$data = file_get_contents($file);
$this->_summary['import_time'] = time();
// Check if the data is v4+ or not
if (strpos($data, '["_version",') === 0) {
Debug2::debug('[Import] Data version: v4+');
$data = explode("\n", $data);
list($k, $v) = \json_decode($v, true);
$ori_data = \json_decode(base64_decode($data), true);
} catch (\Exception $ex) {
Debug2::debug('[Import] ❌ Failed to parse serialized data');
Debug2::debug('[Import] ❌ Failed to import, no data');
Debug2::debug('[Import] Importing data', $ori_data);
$this->cls('Conf')->update_confs($ori_data);
Debug2::debug('Import: Imported ' . $_FILES['ls_file']['name']);
$msg = sprintf(__('Imported setting file %s successfully.', 'litespeed-cache'), $_FILES['ls_file']['name']);
Admin_Display::success($msg);
Debug2::debug('Import: Imported ' . $file);
* Reset all configs to default values.
public function reset() {
$options = $this->cls('Conf')->load_default_vals();
$this->cls('Conf')->update_confs($options);
Debug2::debug('[Import] Reset successfully.');
$msg = __('Reset successfully.', 'litespeed-cache');
Admin_Display::success($msg);
* Generate the filename to export
private function _generate_filename() {
$parsed_home = parse_url(get_home_url());
$filename = 'LSCWP_cfg-';
if (!empty($parsed_home['host'])) {
$filename .= $parsed_home['host'] . '_';
if (!empty($parsed_home['path'])) {
$filename .= $parsed_home['path'] . '_';
$filename = str_replace('/', '_', $filename);
$filename .= '-' . date('Ymd_His') . '.data';
* Handle all request actions from main cls
public function handler() {
$type = Router::verify_type();