PHP网站备份程序代码分享


Posted in PHP onJune 10, 2011

效果图:
PHP网站备份程序代码分享
PHP代码

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 
<title>网站程序备份</title> 
</head> 
<body> 
<form name="myform" method="post" action=""> 
<?php 
error_reporting(E_ALL & ~E_NOTICE); 
ini_set('memory_limit', '2048M'); 
echo "选择要压缩的文件或目录:<br>"; 
$fdir = opendir('./'); 
while($file=readdir($fdir)) 
{ 
if($file=='.'|| $file=='..') 
continue; 
echo "<input name='dfile[]' type='checkbox' value='$file' ".($file==basename(__FILE__)?"":"checked")."> "; 
if(is_file($file)) 
{ 
echo "<font face=\"wingdings\" size=\"5\">2</font>  $file<br>"; 
} 
else 
{ 
echo "<font face=\"wingdings\" size=\"5\">0</font> $file<br>"; 
} 
} 
?> 
<br> 
包含下列文件类型: 
<input name="file_type" type="text" id="file_type" value="" size="50"> 
<font color="red"> 
(文件类型用"|"隔开,默认空则包含任意文件,例:如果需要打包php和jpg文件,则输入"php|jpg") 
</font> 
<br> 
压缩文件保存到目录: 
<input name="todir" type="text" id="todir" value="__dwb2011__" size="15"> 
<font color="red"> 
(留空为本目录,必须有写入权限) 
</font> 
<br> 
压缩文件名称: 
<input name="zipname" type="text" id="zipname" value="dwb2011.zip" size="15"> 
<font color="red"> 
(.zip) 
</font> 
<br> 
<br> 
<input name="myaction" type="hidden" id="myaction" value="dozip"> 
<input type='button' value='反选' onclick='selrev();'> 
<input type="submit" name="Submit" value=" 开始压缩 "> 
<script language='javascript'> 
function selrev() 
{ 
with(document.myform) 
{ 
for(i=0;i<elements.length;i++) 
{ 
thiselm = elements[i]; 
if(thiselm.name.match(/dfile\[]/)) 
thiselm.checked = !thiselm.checked; 
} 
} 
} 
</script> 
<?php 
error_reporting(E_ALL & ~E_NOTICE); 
set_time_limit(0); 
class PHPzip 
{ 
var $file_count = 0 ; 
var $datastr_len = 0; 
var $dirstr_len = 0; 
var $filedata = ''; //该变量只被类外部程序访问 
var $gzfilename; 
var $fp; 
var $dirstr=''; 
var $filefilters = array(); 
function SetFileFilter($filetype) 
{ 
$this->filefilters = explode('|',$filetype); 
} 
//返回文件的修改时间格式. 
//只为本类内部函数调用. 
function unix2DosTime($unixtime = 0) 
{ 
$timearray = ($unixtime == 0) ? getdate() : getdate($unixtime); 
if ($timearray['year'] < 1980) 
{ 
$timearray['year'] = 1980; 
$timearray['mon'] = 1; 
$timearray['mday'] = 1; 
$timearray['hours'] = 0; 
$timearray['minutes'] = 0; 
$timearray['seconds'] = 0; 
} 
return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) | ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1); 
} 
//初始化文件,建立文件目录, 
//并返回文件的写入权限. 
function startfile($path = 'dodo.zip') 
{ 
$this->gzfilename=$path; 
$mypathdir=array(); 
do 
{ 
$mypathdir[] = $path = dirname($path); 
} while($path != '.'); 
@end($mypathdir); 
do 
{ 
$path = @current($mypathdir); 
@mkdir($path); 
} while(@prev($mypathdir)); 
if($this->fp=@fopen($this->gzfilename,"w")) 
{ 
return true; 
} 
return false; 
} 
//添加一个文件到 zip 压缩包中. 
function addfile($data, $name) 
{ 
$name = str_replace('\\', '/', $name); 
if(strrchr($name,'/')=='/') 
return $this->adddir($name); 
if(!empty($this->filefilters)) 
{ 
if (!in_array(end(explode(".",$name)), $this->filefilters)) 
{ 
return; 
} 
} 
$dtime = dechex($this->unix2DosTime()); 
$hexdtime = '\x' . $dtime[6] . $dtime[7] . '\x' . $dtime[4] . $dtime[5] . '\x' . $dtime[2] . $dtime[3] . '\x' . $dtime[0] . $dtime[1]; 
eval('$hexdtime = "' . $hexdtime . '";'); 
$unc_len = strlen($data); 
$crc = crc32($data); 
$zdata = gzcompress($data); 
$c_len = strlen($zdata); 
$zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); 
//新添文件内容格式化: 
$datastr = "\x50\x4b\x03\x04"; 
$datastr .= "\x14\x00"; // ver needed to extract 
$datastr .= "\x00\x00"; // gen purpose bit flag 
$datastr .= "\x08\x00"; // compression method 
$datastr .= $hexdtime; // last mod time and date 
$datastr .= pack('V', $crc); // crc32 
$datastr .= pack('V', $c_len); // compressed filesize 
$datastr .= pack('V', $unc_len); // uncompressed filesize 
$datastr .= pack('v', strlen($name)); // length of filename 
$datastr .= pack('v', 0); // extra field length 
$datastr .= $name; 
$datastr .= $zdata; 
$datastr .= pack('V', $crc); // crc32 
$datastr .= pack('V', $c_len); // compressed filesize 
$datastr .= pack('V', $unc_len); // uncompressed filesize 
fwrite($this->fp,$datastr); //写入新的文件内容 
$my_datastr_len = strlen($datastr); 
unset($datastr); 
//新添文件目录信息 
$dirstr = "\x50\x4b\x01\x02"; 
$dirstr .= "\x00\x00"; // version made by 
$dirstr .= "\x14\x00"; // version needed to extract 
$dirstr .= "\x00\x00"; // gen purpose bit flag 
$dirstr .= "\x08\x00"; // compression method 
$dirstr .= $hexdtime; // last mod time & date 
$dirstr .= pack('V', $crc); // crc32 
$dirstr .= pack('V', $c_len); // compressed filesize 
$dirstr .= pack('V', $unc_len); // uncompressed filesize 
$dirstr .= pack('v', strlen($name) ); // length of filename 
$dirstr .= pack('v', 0 ); // extra field length 
$dirstr .= pack('v', 0 ); // file comment length 
$dirstr .= pack('v', 0 ); // disk number start 
$dirstr .= pack('v', 0 ); // internal file attributes 
$dirstr .= pack('V', 32 ); // external file attributes - 'archive' bit set 
$dirstr .= pack('V',$this->datastr_len ); // relative offset of local header 
$dirstr .= $name; 
$this->dirstr .= $dirstr; //目录信息 
$this -> file_count ++; 
$this -> dirstr_len += strlen($dirstr); 
$this -> datastr_len += $my_datastr_len; 
} 
function adddir($name) 
{ 
$name = str_replace("\\", "/", $name); 
$datastr = "\x50\x4b\x03\x04\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00"; 
$datastr .= pack("V",0).pack("V",0).pack("V",0).pack("v", strlen($name) ); 
$datastr .= pack("v", 0 ).$name.pack("V", 0).pack("V", 0).pack("V", 0); 
fwrite($this->fp,$datastr); //写入新的文件内容 
$my_datastr_len = strlen($datastr); 
unset($datastr); 
$dirstr = "\x50\x4b\x01\x02\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00"; 
$dirstr .= pack("V",0).pack("V",0).pack("V",0).pack("v", strlen($name) ); 
$dirstr .= pack("v", 0 ).pack("v", 0 ).pack("v", 0 ).pack("v", 0 ); 
$dirstr .= pack("V", 16 ).pack("V",$this->datastr_len).$name; 
$this->dirstr .= $dirstr; //目录信息 
$this -> file_count ++; 
$this -> dirstr_len += strlen($dirstr); 
$this -> datastr_len += $my_datastr_len; 
} 
function createfile() 
{ 
//压缩包结束信息,包括文件总数,目录信息读取指针位置等信息 
$endstr = "\x50\x4b\x05\x06\x00\x00\x00\x00" . 
pack('v', $this -> file_count) . 
pack('v', $this -> file_count) . 
pack('V', $this -> dirstr_len) . 
pack('V', $this -> datastr_len) . 
"\x00\x00"; 
fwrite($this->fp,$this->dirstr.$endstr); 
fclose($this->fp); 
} 
} 
if(!trim($_REQUEST[zipname])) 
$_REQUEST[zipname] = "dodozip.zip"; 
else 
$_REQUEST[zipname] = trim($_REQUEST[zipname]); 
if(!strrchr(strtolower($_REQUEST[zipname]),'.')=='.zip') 
$_REQUEST[zipname] .= ".zip"; 
$_REQUEST[todir] = str_replace('\\','/',trim($_REQUEST[todir])); 
if(!strrchr(strtolower($_REQUEST[todir]),'/')=='/') 
$_REQUEST[todir] .= "/"; 
if($_REQUEST[todir]=="/") 
$_REQUEST[todir] = "./"; 
function listfiles($dir=".") 
{ 
global $dodozip; 
$sub_file_num = 0; 
if(is_file("$dir")) 
{ 
if(realpath($dodozip ->gzfilename)!=realpath("$dir")) 
{ 
$dodozip -> addfile(implode('',file("$dir")),"$dir"); 
return 1; 
} 
return 0; 
} 
$handle=opendir("$dir"); 
while ($file = readdir($handle)) 
{ 
if($file=="."||$file=="..") 
continue; 
if(is_dir("$dir/$file")) 
{ 
$sub_file_num += listfiles("$dir/$file"); 
} 
else 
{ 
if(realpath($dodozip ->gzfilename)!=realpath("$dir/$file")) 
{ 
$dodozip -> addfile(implode('',file("$dir/$file")),"$dir/$file"); 
$sub_file_num ++; 
} 
} 
} 
closedir($handle); 
if(!$sub_file_num) 
$dodozip -> addfile("","$dir/"); 
return $sub_file_num; 
} 
function num_bitunit($num) 
{ 
$bitunit=array(' B',' KB',' MB',' GB'); 
for($key=0;$key<count($bitunit);$key++) 
{ 
if($num>=pow(2,10*$key)-1) 
{ //1023B 会显示为 1KB 
$num_bitunit_str=(ceil($num/pow(2,10*$key)*100)/100)." $bitunit[$key]"; 
} 
} 
return $num_bitunit_str; 
} 
if(is_array($_REQUEST[dfile])) 
{ 
$dodozip = new PHPzip; 
if($_REQUEST["file_type"] != NULL) 
$dodozip -> SetFileFilter($_REQUEST["file_type"]); 
if($dodozip -> startfile("$_REQUEST[todir]$_REQUEST[zipname]")) 
{ 
echo "正在添加压缩文件...<br><br>"; 
$filenum = 0; 
foreach($_REQUEST[dfile] as $file) 
{ 
if(is_file($file)) 
{ 
if(!empty($dodozip -> filefilters)) 
if (!in_array(end(explode(".",$file)), $dodozip -> filefilters)) 
continue; 
echo "<font face=\"wingdings\" size=\"5\">2</font>  $file<br>"; 
} 
else 
{ 
echo "<font face=\"wingdings\" size=\"5\">0</font> $file<br>"; 
} 
$filenum += listfiles($file); 
} 
$dodozip -> createfile(); 
echo "<br>压缩完成,共添加 $filenum 个文件.<br><a href='$_REQUEST[todir]$_REQUEST[zipname]' _fcksavedurl='$_REQUEST[todir]$_REQUEST[zipname]'>$_REQUEST[todir]$_REQUEST[zipname] (".num_bitunit(filesize("$_REQUEST[todir]$_REQUEST[zipname]")).")</a>"; 
} 
else 
{ 
echo "$_REQUEST[todir]$_REQUEST[zipname] 不能写入,请检查路径或权限是否正确.<br>"; 
} 
} 
?> 
</form> 
</body> 
</html>
PHP 相关文章推荐
php下载远程文件类(支持断点续传)
Nov 14 PHP
php 高效率写法 推荐
Feb 21 PHP
php计算几分钟前、几小时前、几天前的几个函数、类分享
Apr 09 PHP
C/S和B/S两种架构区别与优缺点分析
Oct 23 PHP
PHP实现将科学计数法转换为原始数字字符串的方法
Dec 16 PHP
以实例全面讲解PHP中多进程编程的相关函数的使用
Aug 18 PHP
PHP微信API接口类
Aug 22 PHP
浅谈PHP中的数据传输CURL
Sep 06 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
Nov 17 PHP
PHP实现的文件浏览器功能简单示例
Sep 12 PHP
浅谈laravel框架sql中groupBy之后排序的问题
Oct 17 PHP
tp5 实现列表数据根据状态排序
Oct 18 PHP
php在页面中调用fckeditor编辑器的方法
Jun 10 #PHP
PHP中遍历stdclass object的实现代码
Jun 09 #PHP
IIS7.X配置PHP运行环境小结
Jun 09 #PHP
php基础学习之变量的使用
Jun 09 #PHP
php学习之数据类型之间的转换介绍
Jun 09 #PHP
php学习之运算符相关概念
Jun 09 #PHP
php学习之流程控制实现代码
Jun 09 #PHP
You might like
在普通HTTP上安全地传输密码
2007/07/21 PHP
Zend 输出产生XML解析错误
2009/03/03 PHP
PHP使用CURL_MULTI实现多线程采集的例子
2014/07/29 PHP
PHP通过内置函数memory_get_usage()获取内存使用情况
2014/11/20 PHP
老生常谈PHP 文件写入和读取(必看篇)
2017/05/22 PHP
showModalDialog 和 showModelessDialog
2007/01/22 Javascript
js判断屏幕分辨率的代码
2013/07/16 Javascript
document节点对象的获取方式示例介绍
2013/12/24 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
2014/04/08 Javascript
JS使用getComputedStyle()方法获取CSS属性值
2014/04/23 Javascript
js两种拼接字符串的简单方法(必看)
2016/09/02 Javascript
EasyUI折叠表格层次显示detailview详解及实例
2016/12/28 Javascript
vue.js 左侧二级菜单显示与隐藏切换的实例代码
2017/05/23 Javascript
深入理解vuex2.0 之 modules
2017/11/20 Javascript
JavaScript封装的常用工具类库bee.js用法详解【经典类库】
2018/09/03 Javascript
微信小程序实现侧边栏分类
2019/10/21 Javascript
Angular6项目打包优化的实现方法
2019/12/15 Javascript
[04:13]2018国际邀请赛典藏宝瓶Ⅱ饰品一览
2018/07/21 DOTA
[01:32]完美世界DOTA2联赛10月29日精彩集锦
2020/10/30 DOTA
Python聊天室程序(基础版)
2018/04/01 Python
在Python中分别打印列表中的每一个元素方法
2018/11/07 Python
Python并发:多线程与多进程的详解
2019/01/24 Python
Python爬取破解无线网络wifi密码过程解析
2019/09/17 Python
科沃斯机器人官网商城:Ecovacs
2016/08/29 全球购物
Spartoo比利时:欧洲时尚购物网站
2017/12/06 全球购物
英国最专业的健身器材供应商之一:Best Gym Equipment
2017/12/22 全球购物
复古服装:RetroStage
2019/05/10 全球购物
婚鞋、新娘鞋、礼服鞋、童鞋:Nina Shoes
2019/09/04 全球购物
求职信模板怎么做
2014/01/26 职场文书
园林系毕业生求职信
2014/06/23 职场文书
项目合作意向书
2015/05/08 职场文书
微信搭讪开场白
2015/05/28 职场文书
springboot项目以jar包运行的操作方法
2021/06/30 Java/Android
OpenCV实现反阈值二值化
2021/11/17 Java/Android
动态规划之使用备忘录来改进Javascript函数
2022/04/07 Javascript
LeetCode189轮转数组python示例
2022/08/05 Python