首页 > php教程 > php手册 > 正文

支持SAE的数据库备份Thinkphp3.2.3

php中文网
发布: 2016-06-07 11:34:33
原创
1215人浏览过

数据库备份是一个好看的功能,支持SAE的数据库备份的类库
支持SAE的数据库备份Thinkphp3.2.3// +----------------------------------------------------------------------<br> // | Author: 左边 (加群:366504956(刚建,欢迎)  交流thinkphp下微信开发)<br> // +----------------------------------------------------------------------<br><br><br><br> //类库放在Application\Common\Libs目录下<br> use \Common\Libs\MySQLReback;<br><br><br><br>     //数据备份<br>     public function sqlback(){<br>         $DataDir = "Databak";<br>         if(!file_exists($DataDir))mkdir($DataDir) ;<br><br>         $opt = trim(I('get.opt'));<br>         $file = trim(I('get.file'));<br>         $mr = new MySQLReback();<br>         $mr-&gt;setDBName(C('DB_NAME'));<br>         $mr-&gt;setPath($DataDir);<br><br>         if ($opt) {<br>             if ($opt == 'backup') {<br>                 $mr-&gt;backup()?$alert = '数据库备份成功!':$alert = $mr-&gt;error();<br>             }<br>             if($opt == 'optimize'){<br>                 $mr-&gt;optimize()?$alert = '数据库优化成功!':$alert = $mr-&gt;error();<br>             }<br>             if ($opt == 'redo' &amp;&amp; $file) {<br>                 $r = $mr-&gt;recover($file);<br>                 $alert = '数据库还原成功'.$r['qty'] ."条";<br>             }<br>             if ($opt== 'del' &amp;&amp; $file) {<br>                 $mr-&gt;remove($file)?$alert = '数据库删除成功!':$alert = $mr-&gt;error();<br>             }<br>             if ($opt == 'download' &amp;&amp; $file ) $mr-&gt;DownloadFile($file);<br>         }<br>         $lists = $mr-&gt;dataList($DataDir);<br>         $this-&gt;assign("list", $lists);<br>         if($alert)<br>             $this-&gt;assign('alert',"alert('".$alert."');");<br>         $this-&gt;display();<br>     }页面<extend></extend><br><block><br>     <script> <br /> $(function(){<br /> $(&#039;.opt&#039;).click(function(){<br /> opt = $(this).data(&#039;opt&#039;);<br /> file = $(this).parent().data(&#039;f&#039;);<br /> location.href = "__ACTION__/opt/"+opt+&#039;/file/&#039;+file;<br /> })<br /> {$alert}<br /> <br /> })<br /> </script><br><br><br></block><br><br><block>系统管理 &gt; 数据库管理</block><br><br><block><br><br>     <table> <br><br>         <tr> <br>             <td> <br>                 <table> <br>                     <tr> <br>                         <td>编号</td> <br>                         <td>文件名</td> <br>                         <td>备份时间</td> <br>                         <td>文件大小</td> <br>                         <td>操作</td> <br><br>                     </tr> <br>                     <volist><br>                         <tr> <br>                             <td> <br>                                 {$key+1}<br>                             </td> <br>                             <td> <br>                                 <a>{$vo.filename}</a><br>                             </td> <br>                             <td> <br>                                 {$vo.filetime}<br>                             </td> <br>                             <td> <br>                                 {:$vo['filesize']/1000} KB<br>                             </td> <br>                             <td> <br>                                 <input><br>                                 <input>    <br>                                 <input><br>                             </td> <br>                         </tr> <br><br>                     </volist><br><br>                     <tr> <br>                         <td> <br>                             <input> <input><br>                         </td> <br><br>                     </tr> <br><br>                 </table> <br>             </td> <br>         </tr> <br><br>     </table> <br><br></block>类文件<?php <br /><br> // +----------------------------------------------------------------------<br> // | Author: 左边 (加群:366504956(刚建,欢迎)  交流thinkphp下微信开发)<br> // +----------------------------------------------------------------------<br><br><br> namespace Common\Libs;<br> use Think\Db;<br> use sinacloud\sae\Storage as Storage;<br><br> class MySQLReback {<br><br>     private $path;<br>     private $isCompress;<br>     private $content;<br>     private $dbName;<br>     private $error;<br>     private $sign = '/*++$*/';<br><br>     const DIR_SEP = DIRECTORY_SEPARATOR;<br><br>     public function __construct() {<br>         $this-&gt;path = 'Databak';<br><br>     }<br><br>     public function setDBName($dbName) {<br>         $this-&gt;dbName = $dbName;<br>     }<br><br>     public function setPath($path) {<br>         $this-&gt;path = $path;<br>     }<br><br>     public function setIsCompress($isCompress){<br>         $this-&gt;isCompress = $isCompress;<br>     }<br><br>     private function getFile($fileName) {<br><br>         if(strtolower(STORAGE_TYPE) == 'sae'){<br>             $s = new Storage();        <br>             $r = json_encode($s -&gt; getObject(strtolower( $this-&gt;path ), $fileName) );<br>             $r = json_decode($r,true);<br>             return $r['body'];<br><br>         }<br>         $fileName = $this-&gt;path . self::DIR_SEP . $fileName;<br>         if (is_file($fileName)) {<br>             $ext = strrchr($fileName, '.');<br>             if ($ext == '.sql') {<br>                 return file_get_contents($fileName);<br>             } elseif ($ext == '.gz') {<br>                 return implode('', gzfile($fileName));<br>             } else {<br>                 $this-&gt;error = '_无法识别的文件格式!';<br>                 return;<br>             }<br>         } else {<br>             $this-&gt;error = '文件不存在!';<br>             return;<br>         }<br>     }<br><br><br>     private function setFile($content) {<br><br>         $recognize = $this-&gt;dbName;<br>         $fileName = $recognize . '_' . date('YmdHis') . '_' . mt_rand(100000000, 999999999) . '.sql';<br><br>         if(strtolower(STORAGE_TYPE) == 'sae'){<br>             $s = new Storage();<br><br>             $root_path = strtolower($this-&gt;$path);<br>         //不存在就创建<br>             $pathArr = $s-&gt;listBuckets();<br>             if(!in_array($root_path,$pathArr) ){<br>                 $s-&gt;putBucket($root_path,'.r:*');<br>             }<br>         //写入<br>             $path = $s-&gt;putObject($content, $root_path, $fileName);<br>             if($path !== true){<br>                 $this-&gt;error = "写入文件失败";<br>                 return;<br>             }<br>             return $path;<br>         }<br><br>         $fileName = $this-&gt;path . self::DIR_SEP .$fileName;<br>         $path = $this-&gt;cetPath($fileName);<br>         if ($path !== true) {<br>             $this-&gt;error = "无法创建备份目录,目录 '$path'";<br>             return;<br>         }<br>         if ($this-&gt;isCompress == 0) {<br>             if (!file_put_contents($fileName, $content, LOCK_EX)) {<br>                 $this-&gt;error = '写入文件失败,请检查磁盘空间或者权限!';<br>                 return;<br>             }<br>         } else {<br>             if (function_exists('gzwrite')) {<br>                 $fileName .= '.gz';<br>                 $gz = gzopen($fileName, 'wb');<br>                 if ($gz) {<br>                     $gw = gzwrite($gz, $content);<br>                     gzclose($gz);<br>                     return $gw;<br>                 } else {<br>                     $this-&gt;error = '写入文件失败,请检查磁盘空间或者权限!';<br>                     return;<br>                 }<br>             } else {<br>                 $this-&gt;error = '没有开启gzip扩展!';<br>                 return;<br>             }<br>         }<br>     }<br><br>     private function cetPath($fileName) {<br>         $dirs = explode(self::DIR_SEP, dirname($fileName));<br>         $tmp = '';<br>         foreach ($dirs as $dir) {<br>             $tmp .= $dir . self::DIR_SEP;<br>             if (!file_exists($tmp) &amp;&amp; !@mkdir($tmp, 0777))<br>                 return;<br>         }<br>         return true;<br>     }<br><br><br>     //备份<br>     public function backup(){<br>         $db = Db::getInstance();<br>         $tables  = $db-&gt;query('SHOW TABLE STATUS');<br>         $tables  = array_map('array_change_key_case', $tables);<br>         $sql = '/* This file is created by MySQLReback ' . date('Y-m-d H:i:s') . ' */';<br>         foreach ($tables as $value) {<br>             $table = $value['name'];            <br>             $result = $db-&gt;query("SHOW CREATE TABLE `{$table}`");<br>             $create = $result[0]['create table'];<br>             $sql .= "\r\n /* 创建表结构 {$table} */";<br>             $sql .= "\r\n DROP TABLE IF EXISTS {$table};". $this-&gt;sign ." {$create};" . $this-&gt;sign;<br><br>             $result = $db-&gt;query("SELECT COUNT(*) AS count FROM `{$table}`");<br>             $count  = $result['0']['count'];<br>             if($count){<br>                 $sql .= "\r\n /* 插入数据 {$table} */";<br><br>                 $result = $db-&gt;query("SELECT * FROM {$table}");<br><br>                 foreach ($result as $row) {<br>                     $row = array_map('addslashes', $row);<br>                     $sql .= "\r\n INSERT INTO {$table} VALUES ( '"  . str_replace( array("\r","\n") , array('\r','\n') ,implode("', '", $row) ) . "' );".$this-&gt;sign;<br>                 }<br>             }<br><br>         }<br><br>         if ($sql) {<br>             return $this-&gt;setFile($sql);<br>         }else{<br>             $this-&gt;error = '数据为空';<br>         }<br>         return;<br><br>     }<br><br>     //删除备份<br>     public function remove($fileName){<br>         if(strtolower(STORAGE_TYPE) == 'sae'){<br>             $s = new Storage();<br>             $r = $s-&gt;deleteObject(strtolower($this-&gt;path), $fileName);<br>             if(!$r){<br>                 $this-&gt;error = '删除失败';<br>                 return;<br>             }<br>             return true;<br>         }<br>         if(!@unlink($this-&gt;path . self::DIR_SEP . $fileName)){<br>             $this-&gt;error = '删除失败';<br>             return;<br>         }<br>         return true;<br>     }<br><br>     //表优化<br>     public function optimize(){<br>         if(strtolower(STORAGE_TYPE) == 'sae'){<br>             $this-&gt;error='SAE数据库不支持表优化';<br>             return ;<br>         }<br>         $db = Db::getInstance();<br>         $list  = $db-&gt;query('SHOW TABLE STATUS');<br>         $list  = array_map('array_change_key_case', $list);<br>         foreach ($list as $key =&gt; $value) {<br>             $tables[] = $value['name'];<br>         }<br><br>         if($tables) {<br>             if(is_array($tables)){<br>                 $tables = implode('`,`', $tables);<br>                 $list[] = $db-&gt;execute("OPTIMIZE TABLE `{$tables}`");<br>             }<br>         }<br>         return $list;<br>     }<br><br>     //恢复<br>     public function recover($fileName) {<br>         $content = $this-&gt;getFile($fileName);<br>         if (!$content) {<br>             if($this-&gt;error)return;<br>             return '数据为空';<br>         }<br>         $content = explode($this-&gt;sign, $content);<br>         $db = Db::getInstance();<br>         foreach ($content as $i =&gt; $sql) {<br>             $sql = trim($sql);<br>             if (!empty($sql)){<br><br>                 $res = $db-&gt;execute($sql);<br><br>                 if($res){<br>                     $rs['qty']++;<br>                 }else{<br>                     $rt[] = $sql;<br>                 }<br>             }<br>         }<br>         $rs['error'] = $rt;<br>         return $rs;<br>     }<br><br>     public function DownloadFile($fileName) {<br>         ob_end_clean();<br>         header("Cache-Control: must-revalidate, post-check=0, pre-check=0");<br>         header('Content-Description: File Transfer');<br>         header('Content-Type: application/octet-stream');<br><br>         if(strtolower(STORAGE_TYPE) == 'sae'){<br>             $s = new Storage();        <br>             $r = json_encode($s -&gt; getObject(strtolower( $this-&gt;path ), $fileName) );<br>             $r = json_decode($r,true);<br>             header('Content-Disposition: attachment; filename="' . $fileName . '"');<br>             echo $r['body'];<br><br>         }else{<br>             $fileName = $this-&gt;path . self::DIR_SEP . $fileName;<br>             $stat = stat($this-&gt;path . self::DIR_SEP . $filename);<br>             header('Content-Disposition: attachment; filename="' . $fileName . '"');<br>             header('Content-Length: ' . $stat['size']);<br>             readfile($fileName);<br>         }<br><br>     }<br><br>     public function dataList() {<br><br>         if(strtolower(STORAGE_TYPE) == 'sae'){<br>             $s = new Storage();<br>             $f = $s-&gt;getBucket( strtolower($this-&gt;path) );<br>             foreach ($f as $v) {<br>                 $rt['filename'] = $v['name'];<br>                 $rt['filetime'] = date('Y-m-d H:i:s',strtotime($v['last_modified']) );<br>                 $rt['filesize'] = $v['bytes'];<br>                 $FileAndFolderAyy[] = $rt;<br>             }<br><br>         }else{<br>             $FilePath = opendir($this-&gt;path);<br>             while (false !== ($filename = readdir($FilePath))) {<br>                 if ($filename!="." &amp;&amp; $filename!=".."){<br>                     $stat = stat($this-&gt;path .'/'. $filename);<br>                     $rt['filename'] = $filename;<br>                     $rt['filetime'] = date('Y-m-d H:i:s', $stat['mtime'] );<br>                     $rt['filesize'] = $stat['size'];<br>                     $FileAndFolderAyy[] = $rt;<br>                 }<br>             }<br>         }<br>         $Order == 0 ? sort($FileAndFolderAyy) : rsort($FileAndFolderAyy);<br>         return $FileAndFolderAyy;<br>     }<br><br><br><br><br>     public function error(){<br>         return $this-&gt;error;<br>     }<br><br><br> }<br><br> ?&gt;

附件 MySQLReback.class.zip ( 2.71 KB 下载:14 次 )

AD:真正免费,域名+虚机+企业邮箱=0元

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号