快速下载多个 FTP 目录

快速下载多个 FTP 目录

我有一个 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 调用此脚本大约需要半小时。之后,我可以下载打包的文件,并且不会受到下载速度限制。

相关内容