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制作静态网站的模板框架(四)
Oct 09 PHP
建立文件交换功能的脚本(一)
Oct 09 PHP
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
Mar 13 PHP
PHP 日常开发小技巧
Sep 23 PHP
Yii中CGridView关联表搜索排序方法实例详解
Dec 03 PHP
php数组添加与删除单元的常用函数实例分析
Feb 16 PHP
PHP开发Apache服务器配置
Jul 15 PHP
PHP类和对象相关系统函数与运算符小结
Sep 28 PHP
phpstudy默认不支持64位php的解决方法
Feb 20 PHP
使用Laravel中的查询构造器实现增删改查功能
Sep 03 PHP
在laravel框架中使用model层的方法
Oct 08 PHP
Laravel 使用查询构造器配合原生sql语句查询的例子
Oct 12 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
用PHP 快速生成 Flash 动画的方法
2007/03/06 PHP
php源代码安装常见错误与解决办法分享
2013/05/28 PHP
深入理解require与require_once与include以及include_once的区别
2013/06/05 PHP
php中的PHP_EOL换行符详细解析
2013/10/26 PHP
CodeIgniter框架数据库事务处理的设计缺陷和解决方案
2014/07/25 PHP
JavaScript与HTML结合的基本使用方法整理
2015/10/12 PHP
4种PHP异步执行的常用方式
2015/12/24 PHP
浅析php如何实现App常用的秒发功能
2016/08/03 PHP
PHP memcache在微信公众平台的应用方法示例
2017/09/13 PHP
JavaScript游戏之优化篇
2010/11/08 Javascript
浅谈jQuery中的事件
2015/03/23 Javascript
js友好的时间返回函数
2016/08/24 Javascript
JS实现重新加载当前页面或者父页面的几种方法
2016/11/30 Javascript
jQuery.Validate表单验证插件的使用示例详解
2017/01/04 Javascript
js中开关变量使用实例
2017/02/24 Javascript
nodejs利用ajax实现网页无刷新上传图片实例代码
2017/06/06 NodeJs
Nodejs实现多房间简易聊天室功能
2017/06/20 NodeJs
实现一个 Vue 吸顶锚点组件方法
2019/07/10 Javascript
Vue路由之JWT身份认证的实现方法
2019/08/26 Javascript
[02:39]DOTA2英雄基础教程 极限穿梭编织者
2013/12/05 DOTA
利用Psyco提升Python运行速度
2014/12/24 Python
Python中使用items()方法返回字典元素对的教程
2015/05/21 Python
Python selenium文件上传方法汇总
2020/11/19 Python
Flask框架使用DBUtils模块连接数据库操作示例
2018/07/20 Python
Python OpenCV读取png图像转成jpg图像存储的方法
2018/10/28 Python
解决torch.autograd.backward中的参数问题
2020/01/07 Python
python输入一个水仙花数(三位数) 输出百位十位个位实例
2020/05/03 Python
Python三维绘图之Matplotlib库的使用方法
2020/09/20 Python
HTML页面中添加Canvas标签示例
2015/01/01 HTML / CSS
英国著名国际平价时尚男装品牌:Topman
2016/08/27 全球购物
化学系大学生自荐信范文
2014/03/01 职场文书
2014年清明节寄语
2014/04/03 职场文书
求职自荐信的格式
2014/04/07 职场文书
法制演讲稿
2014/09/10 职场文书
2014党委书记四风对照检查材料思想汇报
2014/09/21 职场文书
swagger如何返回map字段注释
2021/07/03 Java/Android