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