<?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视频正在看,书也再看,感觉还没怎么着呢就遇到瓶颈的说
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
#1 fileget就是从远程ftp下载文件到本地。
#2 .是ftp服务器登录后能看到的根目录连接ftp->登录->从ftp目录开始递归读取文件,碰到目录就递归调用filecollect,否则就是文件,就推入数组,返回->循环返回的数组,用ftp_get每个数组项,生成本地文件。
recursive_mkdir是递归生成文件夹,就是说你给个路径,比如'F:\a\b\c\d\e',就一次给你建立目录,php5.0之前,这个函数有必要,php5.0+直接用自带的函数mkdir,第三个参数设为true即可.
我自己考虑:
这两个文件放在我的本机上,以计划任务触发.bat文件,但根据程序中所给的目录,我需要把准备备份的文件存入ftp的根目录下。
bat文件中的内容是:“ "E:\www\php5\php.exe" -q "E:\www\Apache2.2\htdocs\mail_bak.php" ”
把bat文件和php文件放入htdocs中.
不知我理解的是否正确,因为我还不清楚ftp的根目录,而且我用的是wamp的集成环境,所以本机没有php.exe,望指教。
<?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;
}
} ?>