程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP基礎知識 >> 如何打造php數據庫備份類

如何打造php數據庫備份類

編輯:PHP基礎知識
 

mysql數據庫的備份是老生常談了。我們可以使用的工具也很多。可以直接在shell下面使用mysql dump,也可以使用phpmyadmin之類的管理工具等等。但,今天筆者還是打算為各位提供一個php的數據庫備份類。可以把它集成到自己編寫的網站後台代碼中,方便使用。

 

數據庫備份類的基本功能有:
1.備份指定數據表
2.打包成zip文件
3.發送到指定郵箱地址

下面看下使用方法:

<?php
error_reporting(0);//消滅萬惡的php報警提示
//設定郵箱
$options = array('email' => array('email1', 'email2'),
'folder' => './backup/',
'mysql' => array('localhost', 'user', 'password', 'db'));

$b = new Backup($options);

// 提交備份命令
if(isset($_POST['backup']))
{
// 開始備份
$b->backupDB();
}
// 顯示備份表
$b->outputForm();
?>

具體類實現:

<?php

class Backup
{
/**
* @var 用於保存配置參數
*/
var $config;

/**
* @var 用於保存mysql dump的數據
*/
var $dump;

/**
* @var 用於數據庫結果數據以及insert指令
*/
var $struktur = array();

/**
* @var 壓縮文件名zip
*/
var $datei;

/**
* 結構函數
* 連接數據庫
* @return
*/
public function Backup($options)
{
// 從形參中讀取配置
foreach($options AS $name => $value)
{
$this->config[$name] = $value;
}

// 連接數據庫
mysql_connect($this->config['mysql'][0], $this->config['mysql'][1],
$this->config['mysql'][2]) or die(mysql_error());
mysql_select_db($this->config['mysql'][3]) or die(mysql_error());
}

/**
* 執行備份數據庫流程的函數
* @return
*/
public function backupDB()
{
// 開始備份的命令
if(isset($_POST['backup']))
{
// 檢測是否選擇了數據表
if(empty($_POST['table']))
{
die("請選擇一個數據表。");
}

/** 開始備份 **/
$tables = array();
$insert = array();
$sql_statement = '';

// 鎖定需要備份的數據庫,防止讀髒數據
foreach($_POST['table'] AS $table)
{
mysql_query("LOCK TABLE $table WRITE");

// 獲取數據庫結構
$res = mysql_query('SHOW CREATE TABLE '.$table.'');
$createtable = mysql_result($res, 0, 1);
$str = "\n\n".$createtable."\n\n";

array_push($tables, $str);

// 查詢數據表中的所有數據行
$sql = 'SELECT * FROM '.$table;
$query = mysql_query($sql) or die(mysql_error());
$feld_anzahl = mysql_num_fields($query);

$sql_statement = '--
-- Data Table `$table`
--
';

// 開始讀數據,並將其轉換為insert命令
while($ds = mysql_fetch_object($query)){
$sql_statement .= 'INSERT INTO `'.$table.'` (';

for ($i = 0;$i <$feld_anzahl;$i++){
if ($i ==$feld_anzahl-1){
$sql_statement .= mysql_field_name($query,$i);
} else {
$sql_statement .= mysql_field_name($query,$i).', ';
}
}

$sql_statement .= ') VALUES (';

for ($i = 0;$i <$feld_anzahl;$i++){
$name = mysql_field_name($query,$i);
if (empty($ds->$name)){
$ds->$name = 'NULL';
}
if ($i ==$feld_anzahl-1){
$sql_statement .= '"'.$ds->$name.'"';
} else {
$sql_statement .= '"'.$ds->$name.'", ';
}
}
$sql_statement .= ");\n";
}

// 將insert數據放在數組中,去重
if(!in_array($sql_statement, $insert))
{
array_push($insert, $sql_statement);
unset($sql_statement);
}

unset($sql_statement);

}

// 將數據庫結構與insert命令放在一起啦
$this->struktur = array_combine($tables, $insert);

// 執行dump函數
$this->createDUMP($this->struktur);

// 生成zip壓縮包
$this->createZIP();

/** 備份結束 **/

// 發一封郵件到指定郵箱,附件包含sql備份,如果你設置了的話^_^
if(isset($this->config['email']) && !empty($this->config['email']))
{
$this->sendEmail();
}

// output
echo '<h3 style="color:green;">備份完成啦</h3><a href="'.
$this->datei.'">下載備份</a>
<br />
<br />';
}
}

/**
* 發送郵件函數
* @return
*/
protected function sendEmail()
{
// 讀取郵箱地址
foreach($this->config['email'] AS $email)
{
$to = $email;

$from = $this->config['email'][0];

$message_body = "本郵件中包含的zip壓縮包為數據庫備份";

$msep = strtoupper (md5 (uniqid (time ())));

// 設置email頭
$header =
"From: $from\r\n" .
"MIME-Version: 1.0\r\n" .
"Content-Type: multipart/mixed; boundary=".$msep."\r\n\r\n" .
"--$msep\r\n" .
"Content-Type: text/plain\r\n" .
"Content-Transfer-Encoding: 8bit\r\n\r\n" .
$message_body . "\r\n";

// 文件名
$dateiname = $this->datei;

// 壓縮包大小
$dateigroesse = filesize ($dateiname);

// 讀取壓縮包
$f = fopen ($dateiname, "r");
// 保存到附件
$attached_file = fread ($f, $dateigroesse);
// 關閉壓縮包
fclose ($f);
// 建立一個附件
$attachment = chunk_split (base64_encode ($attached_file));

// 設置附件頭
$header .=
"--" . $msep . "\r\n" .
"Content-Type: application/zip; name='Backup'\r\n" .
"Content-Transfer-Encoding: base64\r\n" .
"Content-Disposition: attachment; filename='Backup.zip'\r\n" .
"Content-Description: Mysql Datenbank Backup im Anhang\r\n\r\n" .
$attachment . "\r\n";

// 標記附件結束未知
$header .= "--$msep--";

// 郵件標題
$subject = "數據庫備份";

// 發送郵件需要開啟php相應支持哦^^
if(mail($to, $subject, '', $header) == FALSE)
{
die("無法發送郵件,請檢查郵箱地址");
}

echo "<p><small>郵件發送成功</small></p>";
}
}

/**
* 建立數據庫備份的壓縮包並保存到服務器指定目錄中
* @return
*/
protected function createZIP()
{

// 文件夾權限要夠
chmod($this->config['folder'], 0777);

// 建立壓縮包
$zip = new ZipArchive();
// 設置壓縮包文件名
$this->datei = $this->config['folder'].$this->config['mysql'][3]."_"
.date("j_F_Y_g_i_a").".zip";

// 看看壓縮包能不能打開
if ($zip->open($this->datei, ZIPARCHIVE::CREATE)!==TRUE) {
exit("無法打開 <".$this->datei.">\n");
}

// 把dump出來的數據放到壓縮包裡
$zip->addFromString("dump.sql", $this->dump);
// 關閉壓縮包
$zip->close();

// 看看壓縮包有沒有生成
if(!file_exists($this->datei))
{
die("無法生成壓縮包");
}

echo "<p><small>數據庫備份壓縮包成功生成</small></p>";
}

/**
* mysql dump函數
* @param object $dump
* @return
*/
protected function createDUMP($dump)
{
$date = date("F j, Y, g:i a");

$header = <<<HEADER
-- SQL Dump
--
-- Host: {$_SERVER['HTTP_HOST']}
-- Erstellungszeit: {$date}

--
-- Datenbank: `{$this->config['mysql'][3]}`
--

-- --------------------------------------------------------

HEADER;
foreach($dump AS $name => $value)
{
$sql .= $name.$value;
}
$this->dump = $header.$sql;
}

/**
* 生成選擇數據表的界面函數
* @return
*/
public function outputForm()
{
// 選擇全部
$result = mysql_list_tables($this->config['mysql'][3]);

$buffer = '
<fieldset>
<legend>選擇需要備份的數據表</legend>
<form method="post" action="">
<select name="table[]" multiple="multiple" size="30">';
while($row = mysql_fetch_row($result))
{
$buffer .= '<option value="'.$row[0].'">'.$row[0].'</option>';
}
$buffer .= '</select>
<br /><br />
<input type="submit" name="backup" value="備份選定數據表" />
</form>
</fieldset>';

echo $buffer;
}
}

?>

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved