isAjax()) {
// 数据信息
$db = new Backup();
$list = $db->dataList();
// 计算总大小
$total = 0;
foreach ($list as $k => $v) {
$total += $v['data_length'];
$list[$k]['data_size'] = $v['data_length'];
$list[$k]['data_length'] = format_bytes($v['data_length']);
}
// 提示信息
$dataTips = '数据库中共有 ' . count($list) . ' 张表,共计 ' . format_bytes($total) . '大小。';
$data['data'] = $list;
return table_assign(0, $dataTips, $data);
}
return view();
}
//备份数据
public function backup()
{
$db= new Backup();
if(request()->isPost()){
$tables=get_params('tables');
$fileinfo =$db->getFile();
//检查是否有正在执行的任务
$lock = "{$fileinfo['filepath']}backup.lock";
if(is_file($lock)){
return to_assign(2, '检测到有一个备份任务未完成');
} else {
//创建锁文件
file_put_contents($lock,time());
}
// 检查备份目录是否可写
if(!is_writeable($fileinfo['filepath'])){
return to_assign(1, '备份目录不存在或不可写,请检查后重试!');
}
//缓存锁文件
Session::set('lock', $lock);
//缓存备份文件信息
Session::set('backup_file', $fileinfo['file']);
//缓存要备份的表
Session::set('backup_tables', $tables);
//创建备份文件
if(false !== $db->Backup_Init()){
return to_assign(0, '初始化成功,开始备份...',['tab'=>['id' => 0, 'start' => 0,'table'=>$tables[0]]]);
}else{
return to_assign(1, '初始化失败,备份文件创建失败');
}
}else if(request()->isGet()){
$tables = Session::get('backup_tables');
$file=Session::get('backup_file');
$id=get_params('id');
$start=get_params('start');
$start= $db->setFile($file)->backup($tables[$id], $start);
if(false === $start){
return to_assign(1, '备份出错');
}else if(0 === $start){
if(isset($tables[++$id])){
return to_assign(0, '备份完成',['tab'=>['id' => $id, 'start' => 0,'table'=>$tables[$id-1]]]);
} else { //备份完成,清空缓存
unlink(Session::get('lock'));
Session::delete('backup_tables');
Session::delete('backup_file');
add_log('bak');
return to_assign(0, '备份完成',['tab'=>['start' => 'ok','table'=>$tables[$id-1]]]);
}
}
}else{
return to_assign(1, '参数错误!');
}
}
//优化表
public function optimize($tables= null)
{
$db= new Backup();
//return to_assign(0, $db->optimize($tables));
if($db->optimize($tables)){
add_log('optimize');
return to_assign(0, '数据表优化完成');
}else{
return to_assign(1, '数据表优化出错请重试');
}
}
//修复表
public function repair($tables= null)
{
$db= new Backup();
//return to_assign(0, $db->repair($tables));
if($db->repair($tables)){
add_log('repair');
return to_assign(0, '数据表修复完成');
}else{
return to_assign(1, '数据表修复出错请重试');
}
}
//备份文件列表
public function backuplist()
{
$db= new Backup();
$list = $db->fileList();
$fileinfo =$db->getFile();
$lock = "{$fileinfo['filepath']}backup.lock";
$lock_time = 0;
if(is_file($lock)){
$lock_time = file_get_contents($lock);
}
$listNew = [];
$indx = 0;
foreach ($list as $k => $v) {
$listNew[$indx]['time'] = $k;
$listNew[$indx]['timespan'] = $v['time'];
$listNew[$indx]['data'] = $v;
$indx++;
}
$list = $listNew;
array_multisort(array_column($list, 'time'), SORT_DESC, $list);
return view('',['list'=>$list,'lock_time' => $lock_time]);
}
//数据还原
public function import($time = 0, $part = null, $start = null)
{
$db= new Backup();
$time =(int)$time;
if(is_numeric($time) && is_null($part) && is_null($start)){
$list = $db->getFile('timeverif',$time);
if(is_array($list)){
Session::set('backup_list', $list);
return to_assign(0, '初始化完成,开始还原...',array('part' => 1, 'start' => 0,'time' => $time));
}else{
return to_assign(1, '备份文件可能已经损坏,请检查');
}
}else if(is_numeric($part) && is_numeric($start)){
$list=Session::get('backup_list');
$part =(int)$part;
$start =(int)$start;
$start= $db->setFile($list)->import($start,$time,$part);
if(false===$start){
return to_assign(1, '还原数据出错,请重试');
}elseif(0 === $start){
if(isset($list[++$part])){
$data = array('part' => $part, 'start' => 0,'time' => $time);
return to_assign(0, "正在还原...卷{$part},请勿关闭当前页面",$data);
} else {
Session::delete('backup_list');
return to_assign(0, '还原数据成功');
}
}else{
$data = array('part' => $part, 'start' => $start[0],'time' => $time);
if($start[1]){
$rate = floor(100 * ($start[0] / $start[1]));
return to_assign(0, "正在还原...卷{$part} ({$rate}%),请勿关闭当前页面",$data);
} else {
$data['gz'] = 1;
return to_assign(0, "正在还原...卷{$part},请勿关闭当前页面",$data);
}
return to_assign(0, "正在还原...卷{$part},请勿关闭当前页面");
}
}else{
return to_assign(1, "参数错误");
}
}
/**
* 删除备份文件
*/
public function del($time = 0,$lock=0){
$db= new Backup();
if($lock==1){
$fileinfo =$db->getFile();
$lock = "{$fileinfo['filepath']}backup.lock";
if(is_file($lock)){
$time = file_get_contents($lock);
unlink($lock);
}
}
if($db->delFile((int)$time)){
add_log('delete');
return to_assign(0, '删除成功');
}else{
return to_assign(0, '删除失败,请检查权限');
}
}
/**
* 下载备份文件
*/
public function downfile($time = 0,$part=0){
$db= new Backup();
add_log('down');
$db->downloadFile((int)$time,$part-1);
}
}