0

我需要使用 PHP 映射一个 FTP 服务器(在 Windows 上运行),所以我创建了一个函数,该函数本质上是浏览 FTP 的文件夹结构,列出其中的所有内容,并在遇到子文件夹时递归调用自身。

在我的开发环境中一切正常,但一旦我将所有内容迁移到客户的基础设施,事情就发生了转折。他们的 FTP 服务器拥有 30GB 的数据(很多文件,但没有你想象的那么多,因为很多都大于 100MB),所以我预计它会“慢”,但 90 到 120 秒似乎很多。

因此,我对 tcpdump 进行了一些调查,很明显 FTP 服务器具有某种防洪保护,因为在给定的时间点,每个请求都会停滞至少 60 秒。如果我尝试使用 lftp递归地映射服务器,也会发生这种行为。

我目前正在使用主动模式,因为被动引发了以下错误:

Warning: ftp_rawlist() [function.ftp-rawlist]: php_connect_nonb() failed: Operation now in progress (115) in /home/user/public_html/sync.php on line 35

第 35 行引用当前目录的 ftp_rawlist。

我不确定它会有所帮助,但这是我正在使用的代码:

function ftp_get_recursive_paths($conn, $path, $root, $max_level = 0) {
    $files = array();
    $contents = ftp_rawlist($conn, $path);

    if(is_array($contents)) {
        foreach($contents as $line) {
            (...) Parsing the results (...)
            if ((strpos($f, ".DS_Store") === false) && (strpos($f, ".dropbox") === false) && (strpos($f, "Thumbs.db") === false)) {

                if(!strpos($f, '.')) {
                    $init = microtime(true);
                    $files[$f] = (object) array('name' => $f, 'date' => $date, 'path' => $path . $f, 'content' => ftp_get_recursive_paths($conn, $path . $f, $path));
                    $end = microtime(true);
                    echo '<p> Folder ' . $path . $f . ' scanned in '. ($end - $init), ' seconds. </p>';
                }
                else {
                    $files[] = (object) array('name' => $f, 'date' => $date, 'path' => $path .  $f);
                }
            }
        }
    }

    return $files;
}

有谁知道如何防止这种防洪的事情?是防火墙吗?客户端服务器中的某种配置?

我可以确认客户端在 Windows 上使用 Filezilla Server。

4

2 回答 2

1

最后,客户端确实有某种防火墙,可以在某个阈值之后阻止请求。

TL;DR:每个人都在撒谎。

于 2013-07-15T15:42:20.337 回答
0

同样在本地使用时(连接到与 .php 在同一服务器上的 ftp)如果您使用“sftp”它会工作,但远程您必须使用“ftp”或配置好远程客户端

于 2013-11-26T12:01:54.190 回答