| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 | <?php/** * Created by PhpStorm. * User:  NODELOG * Date: 16/3/2 * Time: 下午8:05 */namespace backup\controllers;use backup\models\Database;use yii\base\Exception;use yii\data\ArrayDataProvider;use yii\web\Controller;use yii\web\Response;class ImportController extends Controller{    public function actionIndex()    {        //列出备份文件列表        $path = \Yii::$app->controller->module->params['DATA_BACKUP_PATH'];        if(!is_dir($path)){            mkdir($path, 0755, true);        }        $path = realpath($path);        $flag = \FilesystemIterator::KEY_AS_FILENAME;        $glob = new \FilesystemIterator($path,  $flag);        $list = array();        foreach ($glob as $name => $file) {            if(preg_match('/^\d{8,8}-\d{6,6}-\d+\.sql(?:\.gz)?$/', $name)){                $name = sscanf($name, '%4s%2s%2s-%2s%2s%2s-%d');                $date = "{$name[0]}-{$name[1]}-{$name[2]}";                $time = "{$name[3]}:{$name[4]}:{$name[5]}";                $part = $name[6];                if(isset($list["{$date} {$time}"])){                    $info = $list["{$date} {$time}"];                    $info['part'] = max($info['part'], $part);                    $info['size'] = $info['size'] + $file->getSize();                } else {                    $info['part'] = $part;                    $info['size'] = $file->getSize();                }                $extension        = strtoupper(pathinfo($file->getFilename(), PATHINFO_EXTENSION));                $info['compress'] = ($extension === 'SQL') ? '-' : $extension;                $info['time']     = strtotime("{$date} {$time}");                $list["{$date} {$time}"] = $info;            }        }        $dataProvider = new ArrayDataProvider([            'allModels' => $list        ]);        return $this->render('index', [            'dataProvider' => $dataProvider        ]);    }    /**     * 还原数据库初始化     * @param int $time     * @return mixed     */    public function actionInit($time = 0)    {        \Yii::$app->response->format = Response::FORMAT_JSON;        //获取备份文件信息        $name  = date('Ymd-His', $time) . '-*.sql*';        $path  = realpath(\Yii::$app->controller->module->params['DATA_BACKUP_PATH']) . DIRECTORY_SEPARATOR . $name;        $files = glob($path);        $list  = array();        foreach($files as $name){            $basename = basename($name);            $match    = sscanf($basename, '%4s%2s%2s-%2s%2s%2s-%d');            $gz       = preg_match('/^\d{8,8}-\d{6,6}-\d+\.sql.gz$/', $basename);            $list[$match[6]] = array($match[6], $name, $gz);        }        ksort($list);        //检测文件正确性        $last = end($list);        if(count($list) === $last[0]){            \Yii::$app->session->set('backup_list', $list); //缓存备份列表            return [                'status' => 1,                'part' => 1,                'start' =>0,                'info' => '初始化完成!'            ];        } else {            return [                'status' => 0,                'info' => '备份文件可能已经损坏,请检查!'            ];        }    }    public function actionStart()    {        $part = \Yii::$app->request->post('part');        $start = \Yii::$app->request->post('start');        \Yii::$app->response->format = Response::FORMAT_JSON;        $list  = \Yii::$app->session->get('backup_list');        $db = new Database($list[$part], array(            'path'     => realpath(\Yii::$app->controller->module->params['DATA_BACKUP_PATH']) . DIRECTORY_SEPARATOR,            'compress' => $list[$part][2]));        $start = $db->import($start);        if (false === $start) {            return ['status' => 0, 'info' => '还原数据出错'];        } elseif(0 === $start) { //下一卷            if(isset($list[++$part])){                return [                    'status' => 1,                    'info' => "正在还原...#{$part}",                    'part' => $part,                    'start' => 0                ];            } else {                \Yii::$app->session->set('backup_list', null);                return ['status' => 1, 'info' => '还原完成!'];            }        } else {            if($start[1]){                $rate = floor(100 * ($start[0] / $start[1]));                return [                    'status' => 1,                    'info' => "正在还原...#{$part} ({$rate}%)",                    'part' => $part,                    'start' => $start[0],                ];            } else {                return [                    'status' => 1,                    'info' => "正在还原...#{$part}",                    'part' => $part,                    'start' => $start[0],                    'gz' => 1                ];            }        }    }    public function actionDel()    {        \Yii::$app->response->format = 'json';        $time = \Yii::$app->request->post('time');        if($time){            $name  = date('Ymd-His', $time) . '-*.sql*';            $path  = realpath(\Yii::$app->controller->module->params['DATA_BACKUP_PATH']) . DIRECTORY_SEPARATOR . $name;            array_map("unlink", glob($path));            if(count(glob($path))){                throw new Exception('备份文件删除失败,请检查权限!');            } else {                return ['message' => '备份文件删除成功!'];            }        } else {            throw new Exception('参数错误!');        }    }}
 |