1.连接ftp服务器conn.php
$host='xxx.xxx.xxx.xxx';
$user='xxx';
$pass='xxx';
$conn=ftp_connect($host,21);
if(!$conn){
exit('不能连接到服务器');
}
echo '连接到服务器...<br/>';
$result=@ftp_login($conn,$user,$pass);
if(!$result){
exit('不能登陆到服务器,用户'.$user);
}
echo '用户'.$user.'已登录...<br />';
2.下载主程序download.php
include("./conn.php");
//设置为0不限制脚本执行时间
ini_set('max_execution_time', 0);
$dir=@strip_tags(trim($_GET['dir']));
$act=@strip_tags(trim($_GET['act']));
if(empty($dir)){
$dir='./';
}
if(empty($act)){
$act='index';
}
switch($act){
case 'index':
//获取登陆的ftp目录
$flist=ftp_nlist($conn,$dir);
foreach($flist as $k=>$v) {
echo '<a href="/bak/download.php?dir='.$v.'">'.$v.'</a><a href="/bak/download.php?dir='.$v.'&act=downl">下载</a><br />';
}
break;
case 'downl':
$local="D:/www/bak/bak";
$remote=str_replace('./','/',$dir);
//ftp_set_option($conn,FTP_TIMEOUT_SEC,100000);//设置超时时间
$arr=download_file($conn,$local,$remote);
ftp_quit($conn);
print_r($arr);
break;
}
function download_file($conn,$local,$remote) {
static $error=array();
//列出远程目录的文件名(含子目录),存储在数组中
$flist=ftp_nlist($conn,$remote);
$size=sizeof($flist);
echo "进入远程目录:".$remote."...<br/>";
for($i=0;$i<$size;$i++){
//跳过'.','..'这两个目录
if(!in_array($flist[$i],array('.','..'))){
//判断是目录还是文件 是文件直接下载
//用ftp_rawlist,返回结果会告诉你,是文件还是文件夹,非要用ftp_nlist的话,就循环判断返回值里面的ftp_size,如果是文件夹,会返回-1,但是效率没有ftp_rawlist来得高
$ret=ftp_size($conn,$flist[$i]);
if($ret=='-1'){//是目录时继续循环
//本地目录不存在就创建一个
if(!file_exists($local.$flist[$i])){
//递归创建目录 注:此函数的第三个参数仅限于php5.0以后版本 如果更低版本可用递归循环创建
echo "创建本机目录:".$local.$flist[$i]."/...<br/>";
mkdir($local.$flist[$i], 0700 ,true);
}
//可以查看当前复制目录 不是必须
if(ftp_chdir($conn,$flist[$i])){
echo "进入远程目录:".ftp_pwd($conn)."/...<br/>";
}
download_file($conn,$local,$flist[$i]);
echo "远程目录:".$flist[$i]."结束...<br/><br/>";
}else{ //文件直接下载
$basedir=dirname($flist[$i]);
if(!file_exists($local.$basedir)){
echo "创建本机目录:".$basedir."/...<br/>";
mkdir($local.$basedir, 0700 ,true);
}
if(ftp_get($conn,$local.$flist[$i],$flist[$i],FTP_BINARY)){
echo "<br/>".$flist[$i]."下载成功";
}else {
echo "<br/>".$flist[$i]."下载失败";
$error[]=$flist[$i];
}
}
}
}
return $error;
}
下载流程如上,里面可自由添加下载时间统计、滚动信息显示、主动被动模式选择等,用来一键备份网站时可以将数据库表一键打包下载下来