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
PHP4与PHP3中一个不兼容问题的解决方法
Oct 09 PHP
数据库查询记录php 多行多列显示
Aug 15 PHP
php模拟socket一次连接,多次发送数据的实现代码
Jul 26 PHP
php增删改查示例自己写的demo
Sep 04 PHP
php实现在服务器端调整图片大小的方法
Jun 16 PHP
PHP的Socket网络编程入门指引
Aug 11 PHP
PHP 实现的将图片转换为TXT
Oct 21 PHP
php求今天、昨天、明天时间戳的简单实现方法
Jul 28 PHP
PHP对称加密函数实现数据的加密解密
Oct 27 PHP
php检测mysql表是否存在的方法小结
Jul 20 PHP
PHP设计模式之适配器模式定义与用法详解
Apr 03 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的基本常识小结
2013/07/05 PHP
php数组删除元素示例
2014/03/21 PHP
微信支付PHP SDK之微信公众号支付代码详解
2015/12/09 PHP
Symfony学习十分钟入门经典教程
2016/02/03 PHP
PHP Swoole异步Redis客户端实现方法示例
2019/10/24 PHP
autoIMG 基于jquery的图片自适应插件代码
2011/03/12 Javascript
jQuery load方法用法集锦
2011/12/06 Javascript
js中判断数字\字母\中文的正则表达式 (实例)
2012/06/29 Javascript
jquery必须知道的一些常用特效方法及使用示例(整理)
2013/06/24 Javascript
js改变文章字体大小的实例代码
2013/11/27 Javascript
jquery Tab效果和动态加载的简单实例
2013/12/11 Javascript
巧用jquery解决下拉菜单被Div遮挡的相关问题
2014/02/13 Javascript
js获得当前时区夏令时发生和终止的时间代码
2014/02/23 Javascript
Javascript基础教程之switch语句
2015/01/18 Javascript
JavaScript学习笔记之JS事件对象
2015/01/22 Javascript
nodejs中实现sleep功能实例
2015/03/24 NodeJs
jQuery操作属性和样式详解
2016/04/13 Javascript
JavaScript提升性能的常用技巧总结【经典】
2016/06/20 Javascript
fullPage.js和CSS3实现全屏滚动效果
2017/05/05 Javascript
Nodejs回调加超时限制两种实现方法
2017/06/09 NodeJs
vue-cli配置全局sass、less变量的方法
2019/06/06 Javascript
JS+html5实现异步上传图片显示上传文件进度条功能示例
2019/11/09 Javascript
python使用marshal模块序列化实例
2014/09/25 Python
Python中计算三角函数之cos()方法的使用简介
2015/05/15 Python
Python爬取网易云音乐上评论火爆的歌曲
2017/01/19 Python
Python将多个excel文件合并为一个文件
2018/01/03 Python
Python中利用xpath解析HTML的方法
2018/05/14 Python
ubuntu 16.04下python版本切换的方法
2019/06/14 Python
在python中实现同行输入/接收多个数据的示例
2019/07/20 Python
Python将二维列表list的数据输出(TXT,Excel)
2020/04/23 Python
Django返回HTML文件的实现方法
2020/09/17 Python
刊首寄语大全
2014/04/11 职场文书
技能培训通讯稿
2015/07/18 职场文书
趣味运动会简讯
2015/07/20 职场文书
JavaWeb 入门篇(3)ServletContext 详解 具体应用
2021/07/16 Java/Android
手写Spirit防抖函数underscore和节流函数lodash
2022/03/22 Javascript