我有一个 FTP 服务器,里面有很多嵌套目录。我必须递归下载整个目录。由于目录数量太多(大多数只有一个文件),下载似乎受到限制。
我的两种方法
- 使用 FileZilla(具有多个并行连接)
- 直接从主机下载压缩目录
导致下载速度非常慢,只有几 kb/s。以这样的速度,我需要 5 天才能下载所有文件...这没办法。
我有什么办法可以尽快下载整个 FTP 目录?
答案1
FTP 是一种糟糕的协议 - 压缩和下载文件的方法是合适的,因为这可能比浏览整个目录树要快得多 - 事实上,如果速度只有每秒几 kb,则您和服务器之间可能存在某种速率限制或带宽瓶颈。(或者可能是 MTU 问题)
您没有说是否必须使用 FTP。如果可以绕过它,请尝试使用 SCP,甚至打开 Web 服务器并通过它下载 zip 文件。这两种方法都通过单个 TCP 连接运行,比 FTP 简单得多。
如果您必须使用 FTP,请尝试每种被动和主动模式,并确保主机已启用适当的连接跟踪,或直接使用 VPN 连接到您尝试从中进行 FTP 的服务器,以避免 NAT/防火墙问题。
(尝试在主机上将以太网连接的 MTU 设置得稍微低一些,或者设置 MTU 限制,看看是否有区别)
答案2
由于 FTP 不是复制深层嵌套目录的首选协议,因此我尝试找到一种方法将所有文件打包到服务器端的单个文件中。
可以使用 SSH 控制台打包文件,命令如下
zip -r <username>/backup_29_08_12.zip<username>
由于我提供的服务不允许这样的连接,所以对我来说这是不可能的。
我发现我的提供商允许使用 PEAR 包归档文件。结果是一个打包文件的 PHP 脚本:
<?
@error_reporting(E_ALL ^ E_WARNING);
@ini_set("max_execution_time", 0);
@ini_set("memory_limit", "-1");
$directory = "";
$ignore = array("*.sql.gz", "*.tar.gz");
$path = preg_replace('/(\/www\/htdocs\/\w+\/).*/', '$1', realpath(__FILE__));
include "Archive/Tar.php";
$archivename = preg_replace('/.+\/(.+)\/$/', '$1', $path).date('_Y-m-d_His').".tar.gz";
$archive = new Archive_Tar($archivname, true);
$archive->setIgnoreList($ignore);
$archive->createModify($path.$directory, "", $path);
echo "Backup done";
?>
在文件夹中使用 CHMOD 0777 调用此脚本大约需要半小时。之后,我可以下载打包的文件,并且不会受到下载速度限制。