これは、Web サイトのディレクトリのバックアップに関する PHP チュートリアルの Web サイト バックアップ プログラムです。操作権限のあるディレクトリをパッケージ化し、rar 圧縮ファイルを生成できます。必要な友人がダウンロードして見ていただければ幸いです。
网站程序备份
頭>
<ボディ>
<フォーム名="myform" メソッド="ポスト" アクション="">
error_reporting(E_ALL & ~E_NOTICE);
ini_set('memory_limit', '2048M');
echo "选择要压缩の文書または目录:
";
$fdir = opendir('./');
while($file=readdir($fdir))
{
if($file=='.'|| $file=='..')
続ける;
echo " ";
if(is_file($file))
{
echo "2 $file
";
}
else
{
echo "0 $file
";
}
}
?>
含まれる以下の文章の種類:
(文件型用"|"隔开、默认空包含任意文件、例:如果必要打包phpおよびjpg文件、则输入"php|jpg")
压缩文件保存目录:
(留空は本目录、必须有書入权制限)
压缩文件名:
(.zip)
error_reporting(E_ALL & ~E_NOTICE);
set_time_limit(0);
クラス PHPzip
{
var $file_count = 0 ;
var $datastr_len = 0;
var $dirstr_len = 0;
var $filedata = ''; //この变量だけ被类外部程序访问
var $gzfilename;
var $fp;
var $dirstr='';
var $filefilters = array();
関数 SetFileFilter($filetype)
{
$this->filefilters =explode('|',$filetype);
}
// 文書の修正時刻を返します。
//只本类内部関数数调用。
関数 unix2DosTime($unixtime = 0)
{
$timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
if ($timearray['year'] < 1980)
{
$timearray['year'] = 1980;
$timearray['mon'] = 1;
$timearray['mday'] = 1;
$timearray['時間'] = 0;
$timearray['分'] = 0;
$timearray['秒'] = 0;
}
return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) | ($timearray['時間'] << 11) | ($timearray['分'] << 5) | ($timearray['秒'] >> 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;
}
false を返します。
}
// zip 压缩包内に文書を追加します。
関数 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] 。 'バツ' 。 $dtime[4] 。 $dtime[5] 。 'バツ' 。 $dtime[2] 。 $dtime[3] 。 'バツ' 。 $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 = "x50x4bx03x04";
$datastr .= "x14x00"; //
$datastr .= "x00x00"; を抽出するために必要なバージョン// 生成目的ビットフラグ
$datastr .= "x08x00"; // 圧縮方法
$datastr .= $hexdtime; // 最終更新日時
$datastr .= Pack('V', $crc); // crc32
$datastr .= Pack('V', $c_len); // 圧縮ファイルサイズ
$datastr .= Pack('V', $unc_len); // 非圧縮ファイルサイズ
$datastr .= Pack('v', strlen($name)); // ファイル名の長さ
$datastr .= Pack('v', 0); // 追加のフィールド長
$datastr .= $name;
$datastr .= $zdata;
$datastr .= Pack('V', $crc); // crc32
$datastr .= Pack('V', $c_len); // 圧縮ファイルサイズ
$datastr .= Pack('V', $unc_len); // 非圧縮ファイルサイズ
fwrite($this->fp,$datastr); //新しい文書の内容を書き込みます
$my_datastr_len = strlen($datastr);
unset($datastr);
//新添文件目录情報
$dirstr = "x50x4bx01x02";
$dirstr .= "x00x00"; //
$dirstr .= "x14x00"; によって作成されたバージョン//
$dirstr .= "x00x00"; を抽出するために必要なバージョン// 生成目的ビットフラグ
$dirstr .= "x08x00"; // 圧縮方法
$dirstr .= $hexdtime; // 最終更新日時
$dirstr .= Pack('V', $crc); // crc32
$dirstr .= Pack('V', $c_len); // 圧縮ファイルサイズ
$dirstr .= Pack('V', $unc_len); // 非圧縮ファイルサイズ
$dirstr .= Pack('v', strlen($name) ); // ファイル名の長さ
$dirstr .= Pack('v', 0 ); // 追加のフィールド長
$dirstr .= Pack('v', 0 ); // ファイルコメントの長さ
$dirstr .= Pack('v', 0 ); // ディスク番号の開始
$dirstr .= Pack('v', 0 ); // 内部ファイル属性
$dirstr .= Pack('V', 32 ); // 外部ファイル属性 - 'archive' ビットセット
$dirstr .= Pack('V',$this->datastr_len ); // ローカルヘッダーの相対オフセット
$dirstr .= $name;
$this->dirstr .= $dirstr; //目录情報
$this ->ファイル数++;
$これ -> dirstr_len += strlen($dirstr);
$これ -> datastr_len += $my_datastr_len;
}
関数 adddir($name)
{
$name = str_replace("", "/", $name);
$datastr = "x50x4bx03x04x0ax00x00x00x00x00x00x00x00x00";
$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 = "x50x4bx01x02x00x00x0ax00x00x00x00x00x00x00x00x00";
$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 ->ファイル数++;
$これ -> dirstr_len += strlen($dirstr);
$これ -> datastr_len += $my_datastr_len;
}
function createfile()
{
//压缩包结束情報、含まれる文件数、目录情報读取指针位置等情報
$endstr = "x50x4bx05x06x00x00x00x00" 。
pack('v', $this -> file_count) 。
pack('v', $this -> file_count) 。
pack('V', $this -> dirstr_len) 。
pack('V', $this -> datastr_len) 。
「x00x00」;
fwrite($this->fp,$this->dirstr.$endstr);
fclose($this->fp);
}
}
if(!trim($_REQUEST[zipname]))
$_REQUEST[zipname] = "dodozip.zip";
else
$_REQUEST[zipname] = トリム($_REQUEST[zipname]);
if(!strrchr(strto lower($_REQUEST[zipname]),'.')=='.zip')
$_REQUEST[zipname] .= ".zip";
$_REQUEST[todir] = str_replace('','/',trim($_REQUEST[todir]));
if(!strrchr(strto lower($_REQUEST[todir]),'/')=='/')
$_REQUEST[todir] .= "/";
if($_REQUEST[todir]=="/")
$_REQUEST[todir] = "./";
関数 listfiles($dir=".")
{
global $dodozip;
$sub_file_num = 0;
if(is_file("$dir"))
{
if(realpath($dodozip ->gzfilename)!=realpath("$dir"))
{
$dodozip ->gt; addfile(implode('',file("$dir")),"$dir");
1を返します;
}
0を返す;
}
$handle=opendir("$dir");
while ($file = readdir($handle))
{
if($file=="."||$file=="..")
続行;
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/");
$sub_file_num を返します;
}
関数 num_bitunit($num)
{
$bitunit=array(' B',' KB',' MB',' GB');
for($key=0;$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 = 新しい PHPzip;
if($_REQUEST["file_type"] != NULL)
$dodozip -> SetFileFilter($_REQUEST["file_type"]);
if($dodozip -> startfile("$_REQUEST[todir]$_REQUEST[zipname]"))
{
echo "正在添加压缩文件...
";
$filenum = 0;
foreach($_REQUEST[dfile] as $file)
{
if(is_file($file))
{
if(!empty($dodozip -> filefilters))
if (!in_array(end(explode(") .",$file)), $dodozip -> filefilters))
続ける;
echo "2 $file
";
}
else
{
echo "0 $file
";
}
$filenum += リストファイル($file);
}
$dodozip ->作成ファイル();
echo "
压缩が完了し、$filenum のファイルを共追加しました。
$_REQUEST[todir]$_REQUEST[zipname] (".num_bitunit(filesize("$_REQUEST[todir]$_REQUEST[zipname]")).")";
}
else
{
echo "$_REQUEST[todir]$_REQUEST[zipname] は書き込みできません、请检查路径または权限が正确であるかどうか。
";
}
}
?>
フォーム>