| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 | <?phpnamespace backup\controllers;use backup\models\Database;use yii\base\Exception;use yii\data\ArrayDataProvider;use yii\web\Controller;use yii\web\Response;class ExportController extends Controller{    public function actionIndex()    {        $db    = \Yii::$app->db;        $list  = $db->createCommand('SHOW TABLE STATUS')->queryAll();        $list  = array_map('array_change_key_case', $list);        $dataProvider = new ArrayDataProvider([            'allModels' => $list,            'pagination' => false        ]);        return $this->render('index', [            'dataProvider' => $dataProvider        ]);    }    /**     * 优化表     * @param string $tables 表名     * @return array     * @throws Exception     */    public function actionOptimize($tables = null)    {        \Yii::$app->response->format = Response::FORMAT_JSON;        if($tables) {            $db   = \Yii::$app->db;            if(is_array($tables)){                $tables = implode('`,`', $tables);                $list = $db->createCommand("OPTIMIZE TABLE `{$tables}`")->queryAll();                if($list){                    return [                        'message' => '数据表优化完成'                    ];                } else {                    throw new Exception('数据表优化出错请重试!');                }            } else {                $list = $db->createCommand("OPTIMIZE TABLE `{$tables}`")->queryAll();                if($list){                    return [                        'message' => "数据表'{$tables}'优化完成!"                    ];                } else {                    throw new Exception("数据表'{$tables}'优化出错请重试!");                }            }        } else {            throw new Exception('请指定要优化的表');        }    }    /**     * 修复表     * @param  String $tables 表名     */    public function actionRepair($tables = null)    {        \Yii::$app->response->format = Response::FORMAT_JSON;        if($tables) {            $db   = \Yii::$app->db;            if(is_array($tables)){                $tables = implode('`,`', $tables);                $list = $db->createCommand("REPAIR TABLE `{$tables}`")->queryAll();                if($list){                    return [                        'message' => "数据表修复完成!"                    ];                } else {                    throw new Exception('数据表修复出错请重试');                }            } else {                $list = $db->createCommand("REPAIR TABLE `{$tables}`")->queryAll();                if($list){                    return [                        'message' => "数据表'{$tables}'修复完成!"                    ];                } else {                    throw new Exception("数据表'{$tables}'修复出错请重试!");                }            }        } else {            throw new Exception("请指定要修复的表");        }    }    public function actionInit()    {        \Yii::$app->response->format = Response::FORMAT_JSON;        $tables = \Yii::$app->request->post('tables');        $path = \Yii::$app->controller->module->params['DATA_BACKUP_PATH'];        if(!is_dir($path)){            mkdir($path, 0755, true);        }        //读取备份配置        $config = [            'path'     => realpath($path) . DIRECTORY_SEPARATOR,            'part'     => \Yii::$app->controller->module->params['DATA_BACKUP_PART_SIZE'],            'compress' => \Yii::$app->controller->module->params['DATA_BACKUP_COMPRESS'],            'level'    => \Yii::$app->controller->module->params['DATA_BACKUP_COMPRESS_LEVEL']        ];        //检查是否有正在执行的任务        $lock = "{$config['path']}backup.lock";        if(is_file($lock)){            return ['status' => 0, 'info' => '检测到有一个备份任务正在执行,请稍后再试!'];        } else {            //创建锁文件            file_put_contents($lock, time());        }        //检查备份目录是否可写        if (!is_writeable($config['path'])) {            return ['status' => 0, 'info' => '备份目录不存在或不可写,请检查后重试!'];        }        \Yii::$app->session->set('backup_config', $config);        //生成备份文件信息        $file = array(            'name' => date('Ymd-His', time()),            'part' => 1,        );        \Yii::$app->session->set('backup_file', $file);        //缓存要备份的表        \Yii::$app->session->set('backup_tables', $tables);        //创建备份文件        $Database = new Database($file, $config);        if(false !== $Database->create()){            $tab = ['id' => 0, 'start' => 0];            return [                'status' => 1,                'info' => '初始化成功!',                'tables' => $tables,                'tab' => $tab            ];        } else {            return [                'status' => 0,                'info' => '初始化失败,备份文件创建失败!'            ];        }    }    public function actionStart($id = null, $start = null)    {        \Yii::$app->response->format = Response::FORMAT_JSON;        $tables = \Yii::$app->session->get('backup_tables');        $id = \Yii::$app->request->post('id');        $start = \Yii::$app->request->post('start');        //备份指定表        $Database = new Database(\Yii::$app->session->get('backup_file'), \Yii::$app->session->get('backup_config'));        $start  = $Database->backup($tables[$id], $start);        if(false === $start){ //出错            return [                'status' => 0,                'info' => '备份出错!'            ];        } elseif (0 === $start) { //下一表            if(isset($tables[++$id])){                $tab = array('id' => $id, 'start' => 0);                return [                    'status' => 1,                    'tab' => $tab                ];            } else { //备份完成,清空缓存                unlink(\Yii::$app->session->get('backup_config')['path'] . 'backup.lock');                \Yii::$app->session->set('backup_tables', null);                \Yii::$app->session->set('backup_file', null);                \Yii::$app->session->set('backup_config', null);                return [                    'status' => 1,                    'info' => '备份完成!'                ];            }        } else {            $tab  = array('id' => $id, 'start' => $start[0]);            $rate = floor(100 * ($start[0] / $start[1]));            return [                'status' => 1,                'info' => "正在备份...({$rate}%)",                'tab' => $tab            ];        }    }}
 |