sách gpt4 ai đã đi

ftp - 为什么 CF FTP 传输速度比标准 FTP 慢数倍?

In lại 作者:行者123 更新时间:2023-12-02 14:43:41 27 4
mua khóa gpt4 Nike

我有一个 ColdFusion 应用程序,用于在开发和生产服务器之间传输文件。实际发送文件的代码如下:

ftp = new Ftp();
ftp.setUsername(username);
ftp.setPassword(password);
ftp.setServer(server);
ftp.setTimeout(1800);
ftp.setConnection('dev');
ftp.open();
ftp.putFile(transferMode="binary",localFile=localpath,remoteFile=remotepath);
ftp.close(connection='dev');

使用上述代码发送文件时,我的速度上限略低于 100KB/s(通过接收服务器上的 FileZilla 进行监控)。如果我使用 Windows 命令行 FTP 工具发送完全相同的文件,我的速度将高达 1000KB/s。

我创建了一个全新的文件,只包含上面的代码,并且对传输速度没有影响,所以我知道它与原始应用程序中的周围代码无关。

那么,是什么导致了这些极低的速度?

编辑:所有测试都已完成,将文件从我的生产服务器传输到我的开发服务器。我还尝试使用 tag 而不是 cfscript,我得到了相同的结果。

编辑 #2:我最终使用了 cfexecute ,代码如下:

来 self 的 FTP 脚本:

public function sendFiles(required string localpath, required string remotepath) {
this.writeFtpInstructions(localpath);
exe = "C:\Windows\system32\ftp.exe";
params = "-s:" & request.localapproot & "/" & "upload.txt";
outputfile = request.localapproot & '/ftp.log';
timeout = 120;
Request.cliExec(exe,params,outputfile,timeout);
}

public function writeFtpInstructions(required string localpath) {
instructions = request.localapproot & "/" & "upload.txt";
crlf = chr(13) & chr(10);
data = "";
data &= "open " & this.server & crlf;
data &= this.username & crlf;
data &= this.password & crlf;
data &= "cd " & request.remoteapproot & crlf;
data &= "put " & localpath & crlf;
data &= "quit";
FileWrite(instructions, data);
}

cliExec()函数(需要创建一个包装器,因为 cfscript 中没有 cfexecute 的等效项):






<>
name="#name#"
arguments="#arguments#"
outputFile="#outputfile#"
timeout="#timeout#" />

1 Câu trả lời

根据我在 CF9 上使用 cfftp 的经验,不可能传输更大的文件。如果您在 FTP 服务器端查看事件传输,您会注意到传输以最高速度开始,但随着传输的数据越来越多,速度不断下降。传输 100 MB 后,减少量开始变得非常剧烈,直到最终达到个位数爬行。最终传输超时并失败。我试图处理 330 MB 的文件,发现无法使用 cfftp 进行传输。对于使用标准 Windows ftp.exe 的我来说,cfexecute 不是一个选项,因为它似乎不支持 SFTP。

我最终找到了一个外部java类来通过coldfusion使用并选择了JSch(http://www.jcraft.com/jsch/)。具有讽刺意味的是,CF9 似乎对 CFFTP 使用此类的变体 (jsch-0.1.41m.jar),但使用最新下载的版本 (jsch-0.1.45.jar) 的结果有很大不同。

这是我为概念证明而编写的代码:


stAppPrefs = {
stISOFtp = {
server = 'sftp.server.com',
port = '22',
username = 'youser',
password = 'pa$$w0rd'
}
};

/* Side-Load JSch Java Class (http://www.jcraft.com/jsch/) */
thử {
// Load Class Using Mark Mandel's JavaLoader (http://www.compoundtheory.com/?action=javaloader.index)
/*
Add Mark's LoaderClass To The ColdFusion Class Path Under CF Admin:
Java and JVM : ColdFusion Class Path : C:\inetpub\wwwroot\javaloader\lib\classloader-20100119110136.jar
Then Restart The Coldfusion Application Service
*/
loader = CreateObject("component", "javaloader.JavaLoader").init([expandPath("jsch-0.1.45.jar")]);
// Initiate Instance
jsch = loader.create("com.jcraft.jsch.JSch").init();
}
catch(any excpt) {
WriteOutput("Error loading ""jsch-0.1.45.jar"" java class: " & excpt.Message & "
");
abort;
}

/* SFTP Session & Channel */
thử {
// Create SFTP Session
session = jsch.getSession(stAppPrefs.stISOFtp.username, stAppPrefs.stISOFtp.server, stAppPrefs.stISOFtp.port);
// Turn Off & Use Username/Password
session.setConfig("StrictHostKeyChecking", "no");
session.setPassword(stAppPrefs.stISOFtp.password);
session.connect();
// Create Channel To Transfer File(s) On
channel = session.openChannel("sftp");
channel.connect();
}
catch(any excpt) {
WriteOutput("Error connecting to FTP server: " & excpt.Message & "
");
abort;
}

// Returns Array Of Java Objects, One For Each Zip Compressed File Listed In Root DIR
// WriteDump(channel.ls('*.zip'));
// Get First Zip File Listed For Transfer From SFTP To CF Server
serverFile = channel.ls('*.zip')[1].getFilename();

/* Debug */
startTime = Now();
WriteOutput("Transfer Started: " & TimeFormat(startTime, 'hh:mm:ss') & "
");
/* // Debug */

/* Transfer File From SFTP Server To CF Server */
thử {
// Create File On Server To Write Byte Stream To
transferFile = CreateObject("java", "java.io.File").init(expandPath(serverFile));
channel.get(serverFile, CreateObject("java", "java.io.FileOutputStream").init(transferFile));
// Close The File Output Stream
transferFile = '';
}
catch(any excpt) {
WriteOutput("Error transfering file """ & expandPath(serverFile) & """: " & excpt.Message & "
");
abort;
}

/* Debug */
finishTime = Now();
WriteOutput("Transfer Finished: " & TimeFormat(finishTime, 'hh:mm:ss') & "
");
expiredTime = (finishTime - startTime);
WriteOutput("Duration: " & TimeFormat(expiredTime, 'HH:MM:SS') & "
");
WriteOutput("File Size: " & NumberFormat(Evaluate(GetFileInfo(ExpandPath(serverFile)).size / 1024), '_,___._') & " KB
");
WriteOutput("Transfer Rate: " & NumberFormat(Evaluate(Evaluate(GetFileInfo(ExpandPath(serverFile)).size / 1024) / Evaluate(((TimeFormat(expiredTime, 'H') * 60 * 60) + (TimeFormat(expiredTime, 'M') * 60) + TimeFormat(expiredTime, 'S')))), '_,___._') & " KB/Sec
");
/* // Debug */

channel.disconnect();
session.disconnect();

kết quả:

Transfer Started: 09:37:57
Transfer Finished: 09:42:01
Duration: 00:04:04
File Size: 331,770.8 KB
Transfer Rate: 1,359.7 KB/Sec

所达到的传输速度与我使用 FileZilla FTP 客户端和手动下载所获得的速度相当。我发现这个方法是解决 cfftp 不足的可行方法。

关于ftp - 为什么 CF FTP 传输速度比标准 FTP 慢数倍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6143408/

27 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com