/**
  * 还原数据库
  * @author Rocks
  */
 public function import($time = 0, $part = null, $start = null)
 {
     if (is_numeric($time) && is_null($part) && is_null($start)) {
         //初始化
         //获取备份文件信息
         $name = date('Ymd-His', $time) . '-*.sql*';
         $path = realpath(C('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]) {
             session('backup_list', $list);
             //缓存备份列表
             $this->success('初始化完成!', '', array('part' => 1, 'start' => 0));
         } else {
             $this->error('备份文件可能已经损坏,请检查!');
         }
     } elseif (is_numeric($part) && is_numeric($start)) {
         $list = session('backup_list');
         $db = new Database($list[$part], array('path' => realpath(C('DATA_BACKUP_PATH')) . DIRECTORY_SEPARATOR, 'compress' => $list[$part][2]));
         $start = $db->import($start);
         if (false === $start) {
             $this->error('还原数据出错!');
         } elseif (0 === $start) {
             //下一卷
             if (isset($list[++$part])) {
                 $data = array('part' => $part, 'start' => 0);
                 $this->success("正在还原...#{$part}", '', $data);
             } else {
                 session('backup_list', null);
                 $this->success('还原完成!');
             }
         } else {
             $data = array('part' => $part, 'start' => $start[0]);
             if ($start[1]) {
                 $rate = floor(100 * ($start[0] / $start[1]));
                 $this->success("正在还原...#{$part} ({$rate}%)", '', $data);
             } else {
                 $data['gz'] = 1;
                 $this->success("正在还原...#{$part}", '', $data);
             }
         }
     } else {
         $this->error('参数错误!');
     }
 }
 /**
  * 备份数据库
  * @param  String  $tables 表名
  * @param  Integer $id     表ID
  * @param  Integer $start  起始行数
  * @author slackck<*****@*****.**>
  */
 public function export($tables = null, $id = null, $start = null)
 {
     if (IS_POST && !empty($tables) && is_array($tables)) {
         //初始化
         //读取备份配置
         $config = array('path' => realpath(C('DB_PATH')) . DIRECTORY_SEPARATOR, 'part' => C('DB_PART'), 'compress' => C('DB_COMPRESS'), 'level' => C('DB_LEVEL'));
         //$this->error($config['path'],0,0);
         //检查是否有正在执行的任务
         $lock = "{$config['path']}backup.lock";
         if (is_file($lock)) {
             $this->error('检测到有一个备份任务正在执行,请稍后再试!', 0, 0);
         } else {
             //创建锁文件
             file_put_contents($lock, NOW_TIME);
         }
         //检查备份目录是否可写
         is_writeable($config['path']) || $this->error('备份目录不存在或不可写,请检查后重试!', 0, 0);
         session('backup_config', $config);
         //生成备份文件信息
         $file = array('name' => date('Ymd-His', NOW_TIME), 'part' => 1);
         session('backup_file', $file);
         //缓存要备份的表
         session('backup_tables', $tables);
         //创建备份文件
         $Database = new Database($file, $config);
         if (false !== $Database->create()) {
             $tab = array('id' => 0, 'start' => 0);
             $this->success('初始化成功!', '', array('tables' => $tables, 'tab' => $tab));
         } else {
             $this->error('初始化失败,备份文件创建失败!', 0, 0);
         }
     } elseif (IS_GET && is_numeric($id) && is_numeric($start)) {
         //备份数据
         $tables = session('backup_tables');
         //备份指定表
         $Database = new Database(session('backup_file'), session('backup_config'));
         $start = $Database->backup($tables[$id], $start);
         if (false === $start) {
             //出错
             $this->error('备份出错!', 0, 0);
         } elseif (0 === $start) {
             //下一表
             if (isset($tables[++$id])) {
                 $tab = array('id' => $id, 'start' => 0);
                 $this->success('备份完成!', '', array('tab' => $tab));
             } else {
                 //备份完成,清空缓存
                 unlink(session('backup_config.path') . 'backup.lock');
                 session('backup_tables', null);
                 session('backup_file', null);
                 session('backup_config', null);
                 $this->success('备份完成!', 1, 1);
             }
         } else {
             $tab = array('id' => $id, 'start' => $start[0]);
             $rate = floor(100 * ($start[0] / $start[1]));
             $this->success("正在备份...({$rate}%)", '', array('tab' => $tab));
         }
     } else {
         //出错
         $this->error('参数错误!');
     }
 }