Example #1
0
 /**
  * 备份数据库
  * @param  String  $tables 表名
  * @param  Integer $id     表ID
  * @param  Integer $start  起始行数
  */
 public function export($tables = null, $id = null, $start = null)
 {
     import('ORG.Net.Database');
     if (IS_POST && !empty($tables) && is_array($tables)) {
         //初始化
         //读取备份配置
         $config = array('path' => realpath(C('DATA_BACKUP_PATH')) . DIRECTORY_SEPARATOR, 'part' => C('DATA_BACKUP_PART_SIZE'), 'compress' => C('DATA_BACKUP_COMPRESS'), 'level' => C('DATA_BACKUP_COMPRESS_LEVEL'));
         //检查是否有正在执行的任务
         $lock = "{$config['path']}backup.lock";
         if (is_file($lock)) {
             $this->error('检测到有一个备份任务正在执行,请稍后再试!');
         } else {
             //创建锁文件
             file_put_contents($lock, NOW_TIME);
         }
         //检查备份目录是否可写
         is_writeable($config['path']) || $this->error('备份目录不存在或不可写,请检查后重试!');
         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('初始化失败,备份文件创建失败!');
         }
     } 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('备份出错!');
         } 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('备份完成!');
             }
         } else {
             $tab = array('id' => $id, 'start' => $start[0]);
             $rate = floor(100 * ($start[0] / $start[1]));
             $this->success("正在备份...({$rate}%)", '', array('tab' => $tab));
         }
     } else {
         //出错
         $this->error('参数错误!');
     }
 }