У меня есть приложение 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');
При отправке файла с использованием приведенного выше кода я ограничиваю скорость чуть менее 100 КБ/с (отслеживается через FileZilla на принимающем сервере). Если я отправлю тот же самый файл с помощью инструмента FTP командной строки Windows, моя скорость превысит 1000 КБ/с.
Я создал совершенно новый файл, содержащий только приведенный выше код, и это не влияет на скорость передачи, поэтому я знаю, что он не имеет ничего общего с окружающим кодом в исходном приложении.
Итак, что может быть причиной этих ужасно низких скоростей?
Редактировать: все тесты выполняются для передачи файлов с моего рабочего сервера на мой сервер разработки. Я также пытался использовать тег <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>