Discuz教程网

PHP网站备份程序代码分享

[复制链接]
authicon 星火燎原 发表于 2011-6-11 08:33:52 | 显示全部楼层 |阅读模式
php中通过代码备份网站的实现代码,很方面大家在线备份网站,需要的朋友可以参考下。
效果图:
20110610002232546.gif

PHP代码如下:


  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
  4. <title>网站程序备份</title>
  5. </head>
  6. <body>
  7. <form name="myform" method="post" action="">
  8. <?php
  9. error_reporting(E_ALL & ~E_NOTICE);
  10. ini_set('memory_limit', '2048M');
  11. echo "选择要压缩的文件或目录:<br>";
  12. $fdir = opendir('./');
  13. while($file=readdir($fdir))
  14. {
  15. if($file=='.'|| $file=='..')
  16. continue;
  17. echo "<input name='dfile[]' type='checkbox' value='$file' ".($file==basename(__FILE__)?"":"checked")."> ";
  18. if(is_file($file))
  19. {
  20. echo "<font face="wingdings" size="5">2</font> $file<br>";
  21. }
  22. else
  23. {
  24. echo "<font face="wingdings" size="5">0</font> $file<br>";
  25. }
  26. }
  27. ?>
  28. <br>
  29. 包含下列文件类型:
  30. <input name="file_type" type="text" id="file_type" value="" size="50">
  31. <font color="red">
  32. (文件类型用"|"隔开,默认空则包含任意文件,例:如果需要打包php和jpg文件,则输入"php|jpg")
  33. </font>
  34. <br>
  35. 压缩文件保存到目录:
  36. <input name="todir" type="text" id="todir" value="__dwb2011__" size="15">
  37. <font color="red">
  38. (留空为本目录,必须有写入权限)
  39. </font>
  40. <br>
  41. 压缩文件名称:
  42. <input name="zipname" type="text" id="zipname" value="dwb2011.zip" size="15">
  43. <font color="red">
  44. (.zip)
  45. </font>
  46. <br>
  47. <br>
  48. <input name="myaction" type="hidden" id="myaction" value="dozip">
  49. <input type='button' value='反选' onclick='selrev();'>
  50. <input type="submit" name="Submit" value=" 开始压缩 ">
  51. <script language='javascript'>
  52. function selrev()
  53. {
  54. with(document.myform)
  55. {
  56. for(i=0;i<elements.length;i++)
  57. {
  58. thiselm = elements;
  59. if(thiselm.name.match(/dfile\[]/))
  60. thiselm.checked = !thiselm.checked;
  61. }
  62. }
  63. }
  64. </script>
  65. <?php
  66. error_reporting(E_ALL & ~E_NOTICE);
  67. set_time_limit(0);
  68. class PHPzip
  69. {
  70. var $file_count = 0 ;
  71. var $datastr_len = 0;
  72. var $dirstr_len = 0;
  73. var $filedata = ''; //该变量只被类外部程序访问
  74. var $gzfilename;
  75. var $fp;
  76. var $dirstr='';
  77. var $filefilters = array();
  78. function SetFileFilter($filetype)
  79. {
  80. $this->filefilters = explode('|',$filetype);
  81. }
  82. //返回文件的修改时间格式.
  83. //只为本类内部函数调用.
  84. function unix2DosTime($unixtime = 0)
  85. {
  86. $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
  87. if ($timearray['year'] < 1980)
  88. {
  89. $timearray['year'] = 1980;
  90. $timearray['mon'] = 1;
  91. $timearray['mday'] = 1;
  92. $timearray['hours'] = 0;
  93. $timearray['minutes'] = 0;
  94. $timearray['seconds'] = 0;
  95. }
  96. return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) | ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
  97. }
  98. //初始化文件,建立文件目录,
  99. //并返回文件的写入权限.
  100. function startfile($path = 'dodo.zip')
  101. {
  102. $this->gzfilename=$path;
  103. $mypathdir=array();
  104. do
  105. {
  106. $mypathdir[] = $path = dirname($path);
  107. } while($path != '.');
  108. @end($mypathdir);
  109. do
  110. {
  111. $path = @current($mypathdir);
  112. @mkdir($path);
  113. } while(@prev($mypathdir));
  114. if($this->fp=@fopen($this->gzfilename,"w"))
  115. {
  116. return true;
  117. }
  118. return false;
  119. }
  120. //添加一个文件到 zip 压缩包中.
  121. function addfile($data, $name)
  122. {
  123. $name = str_replace('\\', '/', $name);
  124. if(strrchr($name,'/')=='/')
  125. return $this->adddir($name);
  126. if(!empty($this->filefilters))
  127. {
  128. if (!in_array(end(explode(".",$name)), $this->filefilters))
  129. {
  130. return;
  131. }
  132. }
  133. $dtime = dechex($this->unix2DosTime());
  134. $hexdtime = '\x' . $dtime[6] . $dtime[7] . '\x' . $dtime[4] . $dtime[5] . '\x' . $dtime[2] . $dtime[3] . '\x' . $dtime[0] . $dtime[1];
  135. eval('$hexdtime = "' . $hexdtime . '";');
  136. $unc_len = strlen($data);
  137. $crc = crc32($data);
  138. $zdata = gzcompress($data);
  139. $c_len = strlen($zdata);
  140. $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2);
  141. //新添文件内容格式化:
  142. $datastr = "\x50\x4b\x03\x04";
  143. $datastr .= "\x14\x00"; // ver needed to extract
  144. $datastr .= "\x00\x00"; // gen purpose bit flag
  145. $datastr .= "\x08\x00"; // compression method
  146. $datastr .= $hexdtime; // last mod time and date
  147. $datastr .= pack('V', $crc); // crc32
  148. $datastr .= pack('V', $c_len); // compressed filesize
  149. $datastr .= pack('V', $unc_len); // uncompressed filesize
  150. $datastr .= pack('v', strlen($name)); // length of filename
  151. $datastr .= pack('v', 0); // extra field length
  152. $datastr .= $name;
  153. $datastr .= $zdata;
  154. $datastr .= pack('V', $crc); // crc32
  155. $datastr .= pack('V', $c_len); // compressed filesize
  156. $datastr .= pack('V', $unc_len); // uncompressed filesize
  157. fwrite($this->fp,$datastr); //写入新的文件内容
  158. $my_datastr_len = strlen($datastr);
  159. unset($datastr);
  160. //新添文件目录信息
  161. $dirstr = "\x50\x4b\x01\x02";
  162. $dirstr .= "\x00\x00"; // version made by
  163. $dirstr .= "\x14\x00"; // version needed to extract
  164. $dirstr .= "\x00\x00"; // gen purpose bit flag
  165. $dirstr .= "\x08\x00"; // compression method
  166. $dirstr .= $hexdtime; // last mod time & date
  167. $dirstr .= pack('V', $crc); // crc32
  168. $dirstr .= pack('V', $c_len); // compressed filesize
  169. $dirstr .= pack('V', $unc_len); // uncompressed filesize
  170. $dirstr .= pack('v', strlen($name) ); // length of filename
  171. $dirstr .= pack('v', 0 ); // extra field length
  172. $dirstr .= pack('v', 0 ); // file comment length
  173. $dirstr .= pack('v', 0 ); // disk number start
  174. $dirstr .= pack('v', 0 ); // internal file attributes
  175. $dirstr .= pack('V', 32 ); // external file attributes - 'archive' bit set
  176. $dirstr .= pack('V',$this->datastr_len ); // relative offset of local header
  177. $dirstr .= $name;
  178. $this->dirstr .= $dirstr; //目录信息
  179. $this -> file_count ++;
  180. $this -> dirstr_len += strlen($dirstr);
  181. $this -> datastr_len += $my_datastr_len;
  182. }
  183. function adddir($name)
  184. {
  185. $name = str_replace("\", "/", $name);
  186. $datastr = "\x50\x4b\x03\x04\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00";
  187. $datastr .= pack("V",0).pack("V",0).pack("V",0).pack("v", strlen($name) );
  188. $datastr .= pack("v", 0 ).$name.pack("V", 0).pack("V", 0).pack("V", 0);
  189. fwrite($this->fp,$datastr); //写入新的文件内容
  190. $my_datastr_len = strlen($datastr);
  191. unset($datastr);
  192. $dirstr = "\x50\x4b\x01\x02\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00";
  193. $dirstr .= pack("V",0).pack("V",0).pack("V",0).pack("v", strlen($name) );
  194. $dirstr .= pack("v", 0 ).pack("v", 0 ).pack("v", 0 ).pack("v", 0 );
  195. $dirstr .= pack("V", 16 ).pack("V",$this->datastr_len).$name;
  196. $this->dirstr .= $dirstr; //目录信息
  197. $this -> file_count ++;
  198. $this -> dirstr_len += strlen($dirstr);
  199. $this -> datastr_len += $my_datastr_len;
  200. }
  201. function createfile()
  202. {
  203. //压缩包结束信息,包括文件总数,目录信息读取指针位置等信息
  204. $endstr = "\x50\x4b\x05\x06\x00\x00\x00\x00" .
  205. pack('v', $this -> file_count) .
  206. pack('v', $this -> file_count) .
  207. pack('V', $this -> dirstr_len) .
  208. pack('V', $this -> datastr_len) .
  209. "\x00\x00";
  210. fwrite($this->fp,$this->dirstr.$endstr);
  211. fclose($this->fp);
  212. }
  213. }
  214. if(!trim($_REQUEST[zipname]))
  215. $_REQUEST[zipname] = "dodozip.zip";
  216. else
  217. $_REQUEST[zipname] = trim($_REQUEST[zipname]);
  218. if(!strrchr(strtolower($_REQUEST[zipname]),'.')=='.zip')
  219. $_REQUEST[zipname] .= ".zip";
  220. $_REQUEST[todir] = str_replace('\\','/',trim($_REQUEST[todir]));
  221. if(!strrchr(strtolower($_REQUEST[todir]),'/')=='/')
  222. $_REQUEST[todir] .= "/";
  223. if($_REQUEST[todir]=="/")
  224. $_REQUEST[todir] = "./";
  225. function listfiles($dir=".")
  226. {
  227. global $dodozip;
  228. $sub_file_num = 0;
  229. if(is_file("$dir"))
  230. {
  231. if(realpath($dodozip ->gzfilename)!=realpath("$dir"))
  232. {
  233. $dodozip -> addfile(implode('',file("$dir")),"$dir");
  234. return 1;
  235. }
  236. return 0;
  237. }
  238. $handle=opendir("$dir");
  239. while ($file = readdir($handle))
  240. {
  241. if($file=="."||$file=="..")
  242. continue;
  243. if(is_dir("$dir/$file"))
  244. {
  245. $sub_file_num += listfiles("$dir/$file");
  246. }
  247. else
  248. {
  249. if(realpath($dodozip ->gzfilename)!=realpath("$dir/$file"))
  250. {
  251. $dodozip -> addfile(implode('',file("$dir/$file")),"$dir/$file");
  252. $sub_file_num ++;
  253. }
  254. }
  255. }
  256. closedir($handle);
  257. if(!$sub_file_num)
  258. $dodozip -> addfile("","$dir/");
  259. return $sub_file_num;
  260. }
  261. function num_bitunit($num)
  262. {
  263. $bitunit=array(' B',' KB',' MB',' GB');
  264. for($key=0;$key<count($bitunit);$key++)
  265. {
  266. if($num>=pow(2,10*$key)-1)
  267. { //1023B 会显示为 1KB
  268. $num_bitunit_str=(ceil($num/pow(2,10*$key)*100)/100)." $bitunit[$key]";
  269. }
  270. }
  271. return $num_bitunit_str;
  272. }
  273. if(is_array($_REQUEST[dfile]))
  274. {
  275. $dodozip = new PHPzip;
  276. if($_REQUEST["file_type"] != NULL)
  277. $dodozip -> SetFileFilter($_REQUEST["file_type"]);
  278. if($dodozip -> startfile("$_REQUEST[todir]$_REQUEST[zipname]"))
  279. {
  280. echo "正在添加压缩文件...<br><br>";
  281. $filenum = 0;
  282. foreach($_REQUEST[dfile] as $file)
  283. {
  284. if(is_file($file))
  285. {
  286. if(!empty($dodozip -> filefilters))
  287. if (!in_array(end(explode(".",$file)), $dodozip -> filefilters))
  288. continue;
  289. echo "<font face="wingdings" size="5">2</font> $file<br>";
  290. }
  291. else
  292. {
  293. echo "<font face="wingdings" size="5">0</font> $file<br>";
  294. }
  295. $filenum += listfiles($file);
  296. }
  297. $dodozip -> createfile();
  298. 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>";
  299. }
  300. else
  301. {
  302. echo "$_REQUEST[todir]$_REQUEST[zipname] 不能写入,请检查路径或权限是否正确.<br>";
  303. }
  304. }
  305. ?>
  306. </form>
  307. </body>
  308. </html>

复制代码






上一篇:PHP缩略图等比例无损压缩,可填充空白区域补充色
下一篇:IIS7.X配置PHP运行环境小结
authicon 都市dt1752 发表于 2011-6-13 04:57:32 | 显示全部楼层
本帖最后由 都市dt1752 于 2011-6-13 04:58 编辑

在线备份不错哦,顶好,小白问下这个代码怎么用,写事本打开?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2025-5-2 04:59

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表