bibhamrokhanpin/wp-content/__plugins/wp-optimize/optimizations/optimizetables.php
2024-04-10 17:46:06 +05:45

187 lines
6.4 KiB
PHP

<?php
if (!defined('WPO_VERSION')) die('No direct access allowed');
class WP_Optimization_optimizetables extends WP_Optimization {
protected $auto_id = 'optimize';
protected $setting_id = 'optimize';
protected $dom_id = 'optimize-db';
public $available_for_saving = true;
public $available_for_auto = true;
public $setting_default = true;
public $changes_table_data = true;
public $ui_sort_order = 500;
public $run_sort_order = 100000;
public $run_multisite = true;
public $support_preview = false;
private $table_information = array();
/**
* Optimize method.
*/
public function optimize() {
// We don't need run anything in this method to avoid issues on multisite installations.
}
/**
* Run optimization.
*/
public function after_optimize() {
// check if force optimize sent.
$force = (isset($this->data['optimization_force']) && $this->data['optimization_force']) ? true : false;
// check if single table name posted or optimize all tables.
if (isset($this->data['optimization_table']) && '' != $this->data['optimization_table']) {
$table = $this->optimizer->get_table($this->data['optimization_table']);
if (false !== $table) {
$this->optimize_table($table, $force);
// Exit if the UI elements aren't required
if (isset($this->data['include_ui_elements']) && !$this->data['include_ui_elements']) return;
$wp_optimize = WP_Optimize();
$tablestatus = $wp_optimize->get_db_info()->get_table_status($table->Name, true);
$is_optimizable = $wp_optimize->get_db_info()->is_table_optimizable($table->Name);
$tableinfo = array(
'rows' => number_format_i18n($tablestatus->Rows),
'data_size' => $wp_optimize->format_size($tablestatus->Data_length),
'index_size' => $wp_optimize->format_size($tablestatus->Index_length),
'overhead' => $is_optimizable ? $wp_optimize->format_size($tablestatus->Data_free) : '-',
'type' => $table->Engine,
'is_optimizable' => $is_optimizable,
);
$this->register_meta('tableinfo', $tableinfo);
$tables = $this->optimizer->get_tables(true);
$overhead_usage = 0;
foreach ($tables as $table) {
if ($table->is_optimizable) {
$overhead_usage += $table->Data_free;
}
}
$this->register_meta('overhead', $overhead_usage);
$this->register_meta('overhead_formatted', $wp_optimize->format_size($overhead_usage));
} else {
$this->register_meta('error', 1);
$this->register_meta('message', sprintf(__('The table "%s" does not exist.', 'wp-optimize'), $this->data['optimization_table']));
return false;
}
} else {
$tables = $this->optimizer->get_tables();
foreach ($tables as $table) {
$this->optimize_table($table, $force);
}
}
}
/**
* Optimize table and generate log and output information.
*
* @param object $table_obj table object returned by $this->optimizer->get_tables().
* @param bool $force if true then will optimize
*/
private function optimize_table($table_obj, $force = false) {
// if not forced and table is not optimizable then exit.
if (false == $force && (false == $table_obj->is_optimizable || false == $table_obj->is_type_supported)) return;
if ($table_obj->is_type_supported) {
$this->logger->info('Optimizing: ' . $table_obj->Name);
$this->query('OPTIMIZE TABLE `' . $table_obj->Name . '`');
// For InnoDB Data_free doesn't contain free size.
if ('InnoDB' != $table_obj->Engine) {
$this->optimizer->update_total_cleaned(strval($table_obj->Data_free));
}
$this->register_output(__('Optimized table:', 'wp-optimize') . ' ' . $table_obj->Name);
}
}
/**
* Before get_info() actions.
*/
public function before_get_info() {
$this->table_information['total_gain'] = 0;
$this->table_information['inno_db_tables'] = 0;
$this->table_information['non_inno_db_tables'] = 0;
$this->table_information['table_list'] = '';
$this->table_information['is_optimizable'] = true;
}
/**
* Get information to be disbalyed onscreen before optimization.
*/
public function get_info() {
$table_information = $this->optimizer->get_table_information(get_current_blog_id());
$this->table_information['total_gain'] += $table_information['total_gain'];
$this->table_information['inno_db_tables'] += $table_information['inno_db_tables'];
$this->table_information['non_inno_db_tables'] += $table_information['non_inno_db_tables'];
$this->table_information['table_list'] .= $table_information['table_list'];
if (!$table_information['is_optimizable']) {
$this->table_information['is_optimizable'] = false;
}
}
/**
* Return info about optimization.
*/
public function after_get_info() {
// This gathers information to be displayed onscreen before optimization.
$tablesstatus = $this->table_information;
// Check if database is not optimizable.
if (false === $tablesstatus['is_optimizable']) {
if (isset($this->data['optimization_table']) && '' != $this->data['optimization_table']) {
// This is used for grabbing information before optimizations.
$this->register_output(__('Total gain:', 'wp-optimize').' '.WP_Optimize()->format_size(($tablesstatus['total_gain'])));
}
if ($tablesstatus['inno_db_tables'] > 0) {
// Output message for how many InnoDB tables will not be optimized.
$this->register_output(sprintf(__('Tables using the InnoDB engine (%d) will not be optimized.'), $tablesstatus['inno_db_tables']));
if ($tablesstatus['non_inno_db_tables'] > 0) {
$this->register_output(sprintf(__('Other tables will be optimized (%s).', 'wp-optimize'), $tablesstatus['non_inno_db_tables']));
}
$faq_url = apply_filters('wpo_faq_url', 'https://getwpo.com/faqs/');
$force_db_option = $this->options->get_option('innodb-force-optimize', 'false');
$this->register_output('<input id="innodb_force_optimize" name="innodb-force-optimize" type="checkbox" value="true" '.checked($force_db_option, 'true').'><label for="innodb_force_optimize">'.__('Optimize InnoDB tables anyway.', 'wp-optimize').'</label><br><a href="'.$faq_url.'" target="_blank">'.__('Warning: you should read the FAQ on the risks of this operation first.', 'wp-optimize').'</a>');
}
} else {
$this->register_output(sprintf(__('Tables will be optimized (%s).', 'wp-optimize'), $tablesstatus['non_inno_db_tables'] + $tablesstatus['inno_db_tables']));
}
}
public function get_auto_option_description() {
return __('Optimize database tables', 'wp-optimize');
}
public function settings_label() {
return __('Optimize database tables', 'wp-optimize');
}
}