首頁 >後端開發 >php教程 >php資料庫備份類別 分享一個不錯的php資料庫備份類

php資料庫備份類別 分享一個不錯的php資料庫備份類

WBOY
WBOY原創
2016-07-25 08:56:001117瀏覽
  1. error_reporting(0);//消滅萬惡的php警報提示
  2. //設定信箱
  3. $options = array( 'email' => array('email1', 'email2'),
  4. 'folder' => './backup/',
  5. 'mysql' => array('localhost', 'user', ' password', 'db'));
  6. $b = new Backup($options);
  7. // 提交備份指令
  8. if(isset($_POST['backup'] ))
  9. {
  10. // 開始備份
  11. $b->backupDB();
  12. }
  13. // 顯示備份表
  14. $b->outputForm();
  15. ?>
複製程式碼

php資料庫備份類別的實作代碼:

  1. /**
  2. * 備份mysql資料庫
  3. * edit: bbs.it-home.org
  4. */
  5. class Backup
  6. {
  7. /**
  8. * @var 用來保存配置參數
  9. */
  10. var $config;
  11. /**
  12. * @var 用來保存mysql dump的資料
  13. */
  14. var $dump;
  15. /**
  16. * @var 用於資料庫結果資料以及insert指令
  17. */
  18. var $struktur = array( );
  19. /**
  20. * @var 壓縮檔名zip
  21. */
  22. var $datei;
  23. /**
  24. * 結構函數
  25. * 連接資料庫
  26. * @return
  27. */
  28. public function Backup($options)
  29. {
  30. // 從形參讀取設定
  31. foreach($options AS $name => $value)
  32. {
  33. $this->config[$name] = $value;
  34. }
  35. // 連線資料庫
  36. mysql_connect($this->config['mysql'][0], $this->config['mysql'][1],
  37. $this ->config['mysql'][2]) or die(mysql_error());
  38. mysql_select_db($this->config['mysql'][3]) or die(mysql_error());
  39. }
  40. /**
  41. * 執行備份資料庫流程的函數
  42. * @return
  43. */
  44. public function backupDB()
  45. {
  46. // 開始備份的指令
  47. if(isset($_POST['backup'] ))
  48. {
  49. // 偵測是否選擇了資料表
  50. if(empty($_POST['table']))
  51. {
  52. die("請選取資料表。");
  53. }
  54. /**開始備份 **/
  55. $tables = array();
  56. $insert = array();
  57. $sql_statement = '';
  58. // 鎖定需要備份的資料庫,防止讀取髒資料
  59. foreach($_POST['table'] AS $table)
  60. {
  61. mysql_query("LOCK TABLE $table WRITE" );
  62. // 取得資料庫結構
  63. $res = mysql_query('SHOW CREATE TABLE '.$table.'');
  64. $createtable = mysql_result($res, 0, 1);
  65. $str = "nn".$createtable."nn";
  66. array_push($tables, $str);
  67. // 查詢資料表中的所有資料行
  68. $sql = 'SELECT * FROM '.$table;
  69. $query = mysql_query($sql) or die(mysql_error());
  70. $feld_anzahl = mysql_num_fields($query);
  71. $sql_statement = '--
  72. -- Data Table `$table`
  73. --
  74. ';
  75. // 開始讀取數據,並將其轉換為insert命令
  76. while ($ds = mysql_fetch_object($query)){
  77. $sql_statement .= 'INSERT INTO `'.$table.'` (';
  78. for ($i = 0;$i if ($i ==$feld_anzahl-1){
  79. $sql_statement .= mysql_field_name($query,$i);
  80. } else {
  81. $sql_statement .= mysql_field_name ($query,$i).', ';
  82. }
  83. }
  84. $sql_statement .= ') VALUES (';
  85. for ($i = 0;$ i $name = mysql_field_name($query,$i);
  86. if (empty($ds->$name)){
  87. $ds->$name = 'NULL';
  88. }
  89. if ($i ==$feld_anzahl-1){
  90. $sql_statement .= '"'.$ds->$name.'"';
  91. } else {
  92. $sql_statement .= '"'.$ds->$name.'", ';
  93. }
  94. }
  95. $sql_statement .= ");n";
  96. }
  97. // 將insert資料放在陣列中,去重
  98. if(!in_array($sql_statement, $insert))
  99. {
  100. array_push($insert, $sql_statement);unset($sql_statement);
  101. }
  102. unset($sql_statement);
  103. }
  104. // 將資料庫結構與insert指令放在一起
  105. $this->struktur = array_combine($tables, $insert);
  106. // 執行dump函數
  107. $this->createDUMP($this->struktur);
  108. / / 產生zip壓縮包
  109. $this->createZIP();
  110. /**備份結束 **/
  111. // 寄一封郵件到指定郵箱,附件包含備份,如果你設定了的話^_^
  112. if(isset($this->config['email']) && !empty($this->config['email']))
  113. {
  114. $this->sendEmail();
  115. }
  116. // output
  117. echo '

    備份完成啦

    下載備份


  118. ';
  119. }
  120. }
  121. / **
  122. * 傳送郵件函數
  123. * @return
  124. */
  125. protected function sendEmail()
  126. {
  127. // 讀取郵箱位址
  128. foreach($this->config['email'] AS $email)
  129. {
  130. $to = $email;
  131. $from = $this->config['email'][0];
  132. $message_body = "本郵件中所包含的zip壓縮套件為資料庫備份";
  133. $msep = strtoupper (md5 (uniqid (time ())));
  134. // 設定email頭
  135. $header =
  136. "From : $fromrn" .
  137. "MIME-Version: 1.0rn" .
  138. "Content-Type: multipart/mixed; boundary=".$msep."rnrn" .
  139. "--$mseprn" .
  140. "Content-Type: text/plainrn" .
  141. "Content-Transfer-Encoding: 8bitrnrn" .
  142. $message_body . "rn";
  143. // 檔名
  144. $ dateiname = $this->datei;
  145. // 壓縮包大小
  146. $dateigroesse = filesize ($dateiname);
  147. // 讀取壓縮包$f = f ($dateiname, "r");
  148. // 儲存到附件
  149. $attached_file = fread ($f, $dateigroesse);
  150. // 關閉壓縮包
  151. fclose ($f);
  152. // 建立一個附件
  153. $attachment = chunk_split (base64_encode ($attached_file));
  154. // 設定附件頭
  155. $header .=
  156. "--" . $msep . "rn" .
  157. "Content-Type: application/zip; name='Backup'rn" .
  158. "Content-Transfer-Encoding: base64rn" .
  159. "Content-Disposition: attachment; filename="Content-Disposition: attachment; filename= 'Backup.zip'rn" .
  160. "Content-Description: Mysql Datenbank Backup im Anhangrnrn" .
  161. $attachment . "rn";
  162. // 標記附件結束未知
  163. $header .= "--$msep--";
  164. // 郵件標題
  165. $subject = "資料庫備份";
  166. // 傳送郵件需要開啟php對應支援哦^^
  167. if(mail($to, $subject, '', $header) == FALSE)
  168. {
  169. die("無法發送郵件,請檢查郵箱地址");
  170. }
  171. echo "

    郵件發送成功

    ";
  172. }}
  173. /**
  174. * 建立資料庫備份的壓縮包並儲存到伺服器指定目錄
  175. * @return
  176. */
  177. protected function createZIP()
  178. {
  179. // 資料夾權限要夠
  180. chmod($this->config[ 'folder'], 0777);
  181. // 建立壓縮包
  182. $zip = new ZipArchive();
  183. // 設定壓縮包檔名
  184. $this->datei = $ this->config['folder'].$this->config['mysql'][3]."_"
  185. .date("j_F_Y_g_i_a").".zip";
  186. / / 看看壓縮套件能不能開啟
  187. if ($zip->open($this->datei, ZIPARCHIVE::CREATE)!==TRUE) {
  188. exit("無法開啟datei.">n");
  189. }
  190. // 把dump出來的資料放到壓縮包裡
  191. $zip->addFromString("dump.sql", $this-> dump);
  192. // 關閉壓縮包
  193. $zip->close();
  194. // 看看壓縮包有沒有產生
  195. if(!file_exists($this->datei ))
  196. {
  197. die("無法產生壓縮套件");
  198. }
  199. echo "

    資料庫備份壓縮封包成功產生

    ";
  200. }
  201. /**
  202. * mysql dump 函數
  203. * @param object $dump
  204. * @return
  205. */
  206. protected function createDUMP($dump)
  207. {
  208. $date = date("F j, Y, g :i a");
  209. $header = -- SQL Dump
  210. --
  211. -- Host: {$_SERVER['HTTP_HOST']}
  212. - - Erstellungszeit: {$date}
  213. --
  214. -- Datenbank: `{$this->config['mysql'][3]}`
  215. --
  216. -- ------------------------------------------------ --------
  217. HEADER;
  218. foreach($dump AS $name => $value)
  219. {
  220. $sql .= $name.$value;
  221. }
  222. $this->dump = $header.$sql;
  223. }
  224. /**
  225. * 產生選擇資料表的介面函數
  226. * @return
  227. */
  228. public function outputForm()
  229. {
  230. // 選取全部
  231. $result = mysql_list_tables($this->config['mysql'][3]);
  232. $buffer = '
  233. 選擇需要備份的資料表


  234. ';
  235. echo $buffer;
  236. }
  237. }
  238. ?>
複製程式碼


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn