使用PHP挂起中途递归扫描Windows FTP服务器...为什么?

时间:2013-04-23 10:13:30

标签: php recursion ftp

我需要使用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。

2 个答案:

答案 0 :(得分:1)

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

TL; DR:每个人都撒谎。

答案 1 :(得分:0)

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