Database.php 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. <?php
  2. /**
  3. +-----------------------------------------------------------------------------------------------
  4. * GouGuOPEN [ 左手研发,右手开源,未来可期!]
  5. +-----------------------------------------------------------------------------------------------
  6. * @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
  7. +-----------------------------------------------------------------------------------------------
  8. * @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
  9. +-----------------------------------------------------------------------------------------------
  10. * @Author 勾股工作室 <hdm58@qq.com>
  11. +-----------------------------------------------------------------------------------------------
  12. */
  13. declare (strict_types = 1);
  14. namespace app\home\controller;
  15. use app\base\BaseController;
  16. use backup\Backup;
  17. use think\facade\Session;
  18. use think\facade\View;
  19. class Database extends BaseController
  20. {
  21. //数据表列表
  22. public function database()
  23. {
  24. if (request()->isAjax()) {
  25. // 数据信息
  26. $db = new Backup();
  27. $list = $db->dataList();
  28. // 计算总大小
  29. $total = 0;
  30. foreach ($list as $k => $v) {
  31. $total += $v['data_length'];
  32. $list[$k]['data_size'] = $v['data_length'];
  33. $list[$k]['data_length'] = format_bytes($v['data_length']);
  34. if(strpos($v['name'],'admin_log')){
  35. unset($list[$k]);
  36. }
  37. }
  38. // 提示信息
  39. $dataTips = '数据库中共有<strong> ' . count($list) . '</strong> 张表,共计 <strong>' . format_bytes($total) . '</strong>大小。';
  40. $data['data'] = $list;
  41. return table_assign(0, $dataTips, $data);
  42. }
  43. return view();
  44. }
  45. //备份数据
  46. public function backup()
  47. {
  48. $db = new Backup();
  49. if (request()->isPost()) {
  50. $tables = get_params('tables');
  51. $fileinfo = $db->getFile();
  52. //检查是否有正在执行的任务
  53. $lock = "{$fileinfo['filepath']}backup.lock";
  54. if (is_file($lock)) {
  55. return to_assign(2, '检测到有一个备份任务未完成');
  56. } else {
  57. //创建锁文件
  58. file_put_contents($lock, time());
  59. }
  60. // 检查备份目录是否可写
  61. if (!is_writeable($fileinfo['filepath'])) {
  62. return to_assign(1, '备份目录不存在或不可写,请检查后重试');
  63. }
  64. //缓存锁文件
  65. Session::set('lock', $lock);
  66. //缓存备份文件信息
  67. Session::set('backup_file', $fileinfo['file']);
  68. //缓存要备份的表
  69. Session::set('backup_tables', $tables);
  70. //创建备份文件
  71. if (false !== $db->Backup_Init()) {
  72. return to_assign(0, '初始化成功,开始备份...', ['tab' => ['id' => 0, 'start' => 0, 'table' => $tables[0]]]);
  73. } else {
  74. return to_assign(1, '初始化失败,备份文件创建失败');
  75. }
  76. } else if (request()->isGet()) {
  77. $tables = Session::get('backup_tables');
  78. $file = Session::get('backup_file');
  79. $id = get_params('id');
  80. $start = get_params('start');
  81. $start = $db->setFile($file)->backup($tables[$id], $start);
  82. if (false === $start) {
  83. return to_assign(1, '备份出错');
  84. } else if (0 === $start) {
  85. if (isset($tables[++$id])) {
  86. return to_assign(0, '备份完成', ['tab' => ['id' => $id, 'start' => 0, 'table' => $tables[$id - 1]]]);
  87. } else { //备份完成,清空缓存
  88. unlink(Session::get('lock'));
  89. Session::delete('backup_tables');
  90. Session::delete('backup_file');
  91. add_log('bak');
  92. return to_assign(0, '备份完成', ['tab' => ['start' => 'ok', 'table' => $tables[$id - 1]]]);
  93. }
  94. }
  95. } else {
  96. return to_assign(1, '参数错误!');
  97. }
  98. }
  99. //优化表
  100. public function optimize($tables = null)
  101. {
  102. $db = new Backup();
  103. //return to_assign(0, $db->optimize($tables));
  104. if ($db->optimize($tables)) {
  105. add_log('optimize');
  106. return to_assign(0, '数据表优化完成');
  107. } else {
  108. return to_assign(1, '数据表优化出错请重试');
  109. }
  110. }
  111. //修复表
  112. public function repair($tables = null)
  113. {
  114. $db = new Backup();
  115. //return to_assign(0, $db->repair($tables));
  116. if ($db->repair($tables)) {
  117. add_log('repair');
  118. return to_assign(0, '数据表修复完成');
  119. } else {
  120. return to_assign(1, '数据表修复出错请重试');
  121. }
  122. }
  123. //备份文件列表
  124. public function backuplist()
  125. {
  126. $db = new Backup();
  127. $list = $db->fileList();
  128. $fileinfo = $db->getFile();
  129. $lock = "{$fileinfo['filepath']}backup.lock";
  130. $lock_time = 0;
  131. if (is_file($lock)) {
  132. $lock_time = file_get_contents($lock);
  133. }
  134. $listNew = [];
  135. $indx = 0;
  136. foreach ($list as $k => $v) {
  137. $listNew[$indx]['time'] = $k;
  138. $listNew[$indx]['timespan'] = $v['time'];
  139. $listNew[$indx]['data'] = $v;
  140. $indx++;
  141. }
  142. $list = $listNew;
  143. array_multisort(array_column($list, 'time'), SORT_DESC, $list);
  144. return view('', ['list' => $list, 'lock_time' => $lock_time]);
  145. }
  146. //数据还原
  147. public function import($time = 0, $part = null, $start = null)
  148. {
  149. $db = new Backup();
  150. $time = (int) $time;
  151. if (is_numeric($time) && is_null($part) && is_null($start)) {
  152. $list = $db->getFile('timeverif', $time);
  153. if (is_array($list)) {
  154. Session::set('backup_list', $list);
  155. return to_assign(0, '初始化完成,开始还原...', array('part' => 1, 'start' => 0, 'time' => $time));
  156. } else {
  157. return to_assign(1, '备份文件可能已经损坏,请检查');
  158. }
  159. } else if (is_numeric($part) && is_numeric($start)) {
  160. $list = Session::get('backup_list');
  161. $part = (int) $part;
  162. $start = (int) $start;
  163. $start = $db->setFile($list)->import($start, $time, $part);
  164. if (false === $start) {
  165. return to_assign(1, '还原数据出错,请重试');
  166. } elseif (0 === $start) {
  167. if (isset($list[++$part])) {
  168. $data = array('part' => $part, 'start' => 0, 'time' => $time);
  169. return to_assign(0, "正在还原...卷{$part},请勿关闭当前页面", $data);
  170. } else {
  171. Session::delete('backup_list');
  172. return to_assign(0, '还原数据成功');
  173. }
  174. } else {
  175. $data = array('part' => $part, 'start' => $start[0], 'time' => $time);
  176. if ($start[1]) {
  177. $rate = floor(100 * ($start[0] / $start[1]));
  178. return to_assign(0, "正在还原...卷{$part} ({$rate}%),请勿关闭当前页面", $data);
  179. } else {
  180. $data['gz'] = 1;
  181. return to_assign(0, "正在还原...卷{$part},请勿关闭当前页面", $data);
  182. }
  183. return to_assign(0, "正在还原...卷{$part},请勿关闭当前页面");
  184. }
  185. } else {
  186. return to_assign(1, "参数错误");
  187. }
  188. }
  189. /**
  190. * 删除备份文件
  191. */
  192. public function del($time = 0, $lock = 0)
  193. {
  194. $db = new Backup();
  195. if ($lock == 1) {
  196. $fileinfo = $db->getFile();
  197. $lock = "{$fileinfo['filepath']}backup.lock";
  198. if (is_file($lock)) {
  199. $time = file_get_contents($lock);
  200. unlink($lock);
  201. }
  202. }
  203. if ($db->delFile((int) $time)) {
  204. add_log('delete');
  205. return to_assign(0, '删除成功');
  206. } else {
  207. return to_assign(0, '删除失败,请检查权限');
  208. }
  209. }
  210. /**
  211. * 下载备份文件
  212. */
  213. public function downfile($time = 0, $part = 0)
  214. {
  215. $db = new Backup();
  216. add_log('down');
  217. $db->downloadFile((int) $time, $part - 1);
  218. }
  219. }