= 1024; $i++) { $bit /= 1024; } return (floor($bit * 100) / 100) . $type[$i]; } /** * 获取列表 */ public function index(Request $request) { if (request()->isAjax()) { $request->path(); $dir = public_path() . '/storage/backup/*'; $fileList = glob($dir); // 获取文件列表 $backup = []; foreach ($fileList as $k => $v) { if (substr($v, strrpos($v, '.') + 1) === 'zip') { $backup[$k]['filename'] = basename($v); $backup[$k]['filesize'] = $this->countSize(filesize($v)); $backup[$k]['time'] = date('Y-m-d H:i:s', filemtime($v)); $backup[$k]['dowloadUrl'] = 'download?name=' . basename($v); } } return $this->success(dataReturn(0, 'success', $backup)); } return view('backup/index'); } /* * @Title: 下载备份 * @Description: 下载备份 */ public function download(Request $request) { $name = $request->input('name'); $dir = public_path() . '/storage/backup/'; return response()->download($dir . $name, $name); } /* * @Title: 删除备份 * @Description: 删除备份 */ public function del(Request $request) { $name = $request->input('name'); $dir = public_path() . '/storage/backup/' . $name; if (file_exists($dir)) { // 判断文件是否存在 if (unlink($dir)) { return $this->success(dataReturn(0, '删除成功')); } } return $this->success(dataReturn(-1, '删除失败')); } /** * 创建备份 */ public function add(Request $request) { if (request()->isAjax()) { //备份数据库配置 $dumpSettings = array( 'compress' => IMysqldump\Mysqldump::NONE, 'no-data' => false, 'add-drop-table' => true, 'single-transaction' => true, 'lock-tables' => true, 'add-locks' => true, 'extended-insert' => true, 'disable-foreign-keys-check' => true, 'skip-triggers' => false, 'add-drop-trigger' => true, 'databases' => true, 'add-drop-database' => true, 'hex-blob' => true, ); try { //配置mysql $dump = new IMysqldump\Mysqldump( 'mysql:host=' . env('DB_HOST') . ';dbname=' . env('DB_NAME'), env('DB_USER'), env('DB_PASSWORD'), $dumpSettings ); //生成临时目录 $ymdRand = date('ymd') . substr(time(), -4) . generate_random_string(2); $backupName = "database_{$ymdRand}"; $tmpBackupPath = escape_windows_path(runtime_path("backup/{$backupName}/")); if (!is_dir($tmpBackupPath)) { if (!mkdir($tmpBackupPath, 0755, true)) { throw new BusinessException("创建临时文件夹失败!"); } } //生成临时sql文件 $name = $backupName . ".sql"; $dump->start($tmpBackupPath . $name); //打包文件名 $saveZipName = escape_windows_path((public_path('storage/backup/' . $backupName . '.zip'))); $password = ''; if (extension_loaded('zip')) { $zip = new ZipArchive(); if ($zip->open($saveZipName, ZipArchive::CREATE) === TRUE) { $files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($tmpBackupPath), RecursiveIteratorIterator::LEAVES_ONLY ); foreach ($files as $file) { if (!$file->isDir()) { $filePath = $file->getRealPath(); $zip->addFile($filePath, basename($filePath)); } } !empty($password) && $zip->setPassword($password); } $zip->close(); delete_folder($tmpBackupPath); var_dump(66666); } else { throw new BusinessException("无法通过zip的方式压缩数据,服务器缺少相关扩展支持!"); } } catch (\Exception $e) { return $this->success(dataReturn(-1, $e->getMessage())); } return $this->success(dataReturn(0, '数据库备份成功')); } } }