我有一个 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。
我用上面的代码创建了一个全新的文件,它对传输速度没有影响,所以我知道它与原始应用程序中的周围代码无关。
那么,是什么导致了这些极低的速度呢?
编辑:所有测试都在将文件从我的生产服务器传输到我的开发服务器。我也尝试使用<cfftp>
标签而不是 cfscript,我得到了相同的结果。
编辑#2:我最终使用cfexecute
了,代码如下:
从我的 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
项):
<cffunction name="cliExec">
<cfargument name="name">
<cfargument name="arguments">
<cfargument name="outputfile">
<cfargument name="timeout">
<cfexecute
name="#name#"
arguments="#arguments#"
outputFile="#outputfile#"
timeout="#timeout#" />
</cffunction>