<?php $remote_addr = '220.xx.xx.xx';  //remote远程
$user_name   = 'xxxx';
$user_pwd    = 'xxxx';
$dir_prefix  = 'F:\\mail\\'. date('Y-m-d');    //prefix前缀

recursive_mkdir($dir_prefix);              //recursive递归

$conn_id = ftp_connect($remote_addr) or die("Couldn't connect to server");    //建立ftp新连接
  
  if (@ftp_login($conn_id, $user_name, $user_pwd))
  {
  
   $filelist = filecollect($conn_id);                    //collect收集
   
   foreach($filelist as $remote_file)
   {
    $local_file = $dir_prefix . substr($remote_file,1);       //local_file 本地文件
echo $local_file .'<br>';
fileget($conn_id,$local_file,$remote_file);
}
   
  }
  
// close the connection
ftp_close($conn_id);  


//递归方式读取目录中的文件
function filecollect($cid,$dir='.') 
{
static $flist=array();
if ($files = ftp_nlist($cid,$dir))
{
foreach ($files as $file) 
{
if (ftp_size($cid, $file) == "-1")
{
filecollect($cid,$file);

else
{
$flist[] = $file;
}
}
}
return $flist;
}

//创建目录并下载文件
function fileget($cid,$local_file, $server_file) 
{   
//目录不存在就创建 
if (!file_exists (dirname($local_file))) 

if (!@mkdir (dirname($local_file), 0777)) 

die($local_file."目录创建失败!"); 

}     

if (ftp_get($cid, $local_file, $server_file, FTP_BINARY)) 
{
echo "传输成功\n";

else 
{
echo "传输失败\n";
}
 //chmod($local_file,0666);
}

function recursive_mkdir( $folder )
{
$folder = explode( DIRECTORY_SEPARATOR , $folder );
$mkfolder = '';
for(  $i=0 ; isset( $folder[$i] ) ; $i++ )
   {
   $mkfolder .= $folder[$i];
   if( !is_dir( $mkfolder ) )
   mkdir( "$mkfolder" ,  0777);
   $mkfolder .= DIRECTORY_SEPARATOR;
   }
} ?> 给我的程序附带了一个.bat文件 ,触发做邮件系统备份,程序员说让我自己看,小弟实在看不懂,手里有一个红色的php和mysql开发  圣经第四版的书  ,查询无果,相应的php手册也没有查到什么  公司小,没有师傅,程序员是做后台的,所以也没有理由手把手带我,希望朋友们能帮我讲一下。。
我把程序分三段看  第一段是打开ftp连接   然后是递归读取目录  最后是下载文件
第一段中的fileget我不明白他的意思
第二段读取目录function filecollect($cid,$dir='.')     dir后面的单引号中是让我填写要备份的文件以及格式么?
最后一段下载的地方  function recursive_mkdir的方法  不知道是什么作用ps:小弟自学php大概4个月了,始终没有什么起色,加上在公司也帮忙做做别的,所以也不是很。。
感觉自学很吃力,找猫画虎,但是有的时候找不到猫,不知道如何去画,php100视频正在看,书也再看,感觉还没怎么着呢就遇到瓶颈的说

解决方案 »

  1.   


    recursive_mkdir($dir_prefix);              //recursive递归
        
        $conn_id = ftp_connect($remote_addr) or die("Couldn't connect to server");    //建立ftp新连接
          
          if (@ftp_login($conn_id, $user_name, $user_pwd))
          {
                  
               $filelist = filecollect($conn_id);                    //collect收集
               
               foreach($filelist as $remote_file)
               {
                    $local_file = $dir_prefix . substr($remote_file,1);       //local_file 本地文件
                    echo $local_file .'<br>';
                    fileget($conn_id,$local_file,$remote_file);
                }
           
          }没用过FTP 的函数,不过看代码应该是这样的
    用你的流程来说吧
    1,首先建立 和 FTP 的通信 
    2,登录FTP成功  filecollect(通信地址,文件目录位置='默认位置') 例如 wwwroot/test 目录
    3,与通信地址成功连接 ftp_nlist 返回wwwroot/test 中 所有 文件 既 文件目录 地址 数组
    4,例如 wwwroot/test 中有 1个文件abc.php 1个文件夹 abc. 
    5,返回 wwwroot/test/abc.php 和 wwwroot/test/abc
    6,foreach 循环 wwwroot/test/abc.php 和 wwwroot/test/abc 
    7,ftp_size 检查 该地址是否 文件。 是则 存入 数组 $flist 中
     否则 递归循环 跳转至 第3步 并以  wwwroot/test/abc 为地址 继续循环 直到 所有文件 被找出 并储存 于  数组 $flist 中 终止递 归循环 return 数组 $flist 赋值到 $filelist 中
    8,$filelist 循环所有刚刚得到的所有FTP 文件地址
    9,fileget() 与通信地址成功连接
    并得到 循环中的 单个地址 FTP 文件地址 $remote_file 和 需要存储到的本文件地址 $local_file
    10,file_exists 检查是否有这个目录 存在。 否则 创建 并 设置权限为 0777
    (在这里需要注意!应把 recursive_mkdir() 放置 if (!@mkdir (dirname($local_file), 0777)) 
    下 并 参数 设置为 dirname($local_file))
    11,ftp_get 将 FTP 文件 以二进制方式 下载 到 第10步 创建的文件夹 中去 ftp_get 成功返回 true 失败为 false
      

  2.   

    他给你的bat文件应该是让你做计划任务 自动执行的.具体的看看bat文件的内容.
      

  3.   

    ftp_前缀那些自己读读手册了。
    #1 fileget就是从远程ftp下载文件到本地。
    #2 .是ftp服务器登录后能看到的根目录连接ftp->登录->从ftp目录开始递归读取文件,碰到目录就递归调用filecollect,否则就是文件,就推入数组,返回->循环返回的数组,用ftp_get每个数组项,生成本地文件。
    recursive_mkdir是递归生成文件夹,就是说你给个路径,比如'F:\a\b\c\d\e',就一次给你建立目录,php5.0之前,这个函数有必要,php5.0+直接用自带的函数mkdir,第三个参数设为true即可.
      

  4.   

    谢了,最后我想问一下使用方法:
    我自己考虑:
    这两个文件放在我的本机上,以计划任务触发.bat文件,但根据程序中所给的目录,我需要把准备备份的文件存入ftp的根目录下。
    bat文件中的内容是:“ "E:\www\php5\php.exe" -q "E:\www\Apache2.2\htdocs\mail_bak.php" ”
    把bat文件和php文件放入htdocs中.
    不知我理解的是否正确,因为我还不清楚ftp的根目录,而且我用的是wamp的集成环境,所以本机没有php.exe,望指教。
      

  5.   

    稍微加了点注释;各位看看有啥不妥的不;
    <?php    $remote_addr = '220.xx.xx.xx';  //remote远程
        $user_name   = 'xxxx';
        $user_pwd    = 'xxxx';
        $dir_prefix  = 'F:\\mail\\'. date('Y-m-d');    //prefix前缀
        
        recursive_mkdir($dir_prefix);              //recursive递归
        
        $conn_id = ftp_connect($remote_addr) or die("Couldn't connect to server");    //建立ftp新连接
          
          if (@ftp_login($conn_id, $user_name, $user_pwd))
          {
                  
               $filelist = filecollect($conn_id);                    //collect收集
               
               foreach($filelist as $remote_file)
               {
                    $local_file = $dir_prefix . substr($remote_file,1);       //local_file 本地文件//这个地方不应该是1吧,应该是0才对的嘛;
                    echo $local_file .'<br>';
                    fileget($conn_id,$local_file,$remote_file);
                }
           
          }
          
        // close the connection
        ftp_close($conn_id);  
        
        
        //递归方式读取目录中的文件
        function filecollect($cid,$dir='.') 
        {
            static $flist=array();
            if ($files = ftp_nlist($cid,$dir))//返回给定目录下的所有文件名的一个list,返回类型是数组;
            {
                //我觉的这里应该加一个判断,确定 $files不是空数组;
                foreach ($files as $file) 
                {
                    if (ftp_size($cid, $file) == "-1")//如果没有得到文件大小(这个是判断这个file是不一个folder,如果是folder继续遍历一下直到把所有目录名弄倒$file里面)
                    {
                        filecollect($cid,$file);
                    } 
                    else
                    {
                        $flist[] = $file;
                    }
                }
            }
            return $flist;//这里得到的是一个存储着所有file name的一个数组$file;
        }
        
        //创建目录并下载文件
        function fileget($cid,$local_file, $server_file) 
        {   
            //目录不存在就创建 
            if (!file_exists (dirname($local_file))) 
            { 
                if (!@mkdir (dirname($local_file), 0777)) 
                { 
                    die($local_file."目录创建失败!"); 
                } 
            }     
            
            if (ftp_get($cid, $local_file, $server_file, FTP_BINARY)) 
            {
                echo "传输成功\n";
            } 
            else 
            {
                echo "传输失败\n";
            }
             //chmod($local_file,0666);
        }
        
        function recursive_mkdir( $folder )//这个函数就创建$dir_prefix  = 'F:\\mail\\'. date('Y-m-d');这个变量的folder;
        {
            //DIRECTORY_SEPARATOR是当前系统的目录分割符 linux 是\;windows是/
            $folder = explode( DIRECTORY_SEPARATOR , $folder );
            $mkfolder = '';
            for(  $i=0 ; isset( $folder[$i] ) ; $i++ )
               {
               $mkfolder .= $folder[$i];
               if( !is_dir( $mkfolder ) )
                   mkdir( "$mkfolder" ,  0777);
               $mkfolder .= DIRECTORY_SEPARATOR;
               }
        }    ?>