Javascript 为什么这个SFTP下载这么慢?
我在单击时有一个下载按钮,下载一个文件大约需要15秒,因为它必须将SFTP导入服务器,找到正确的路径/文件,然后返回响应Javascript 为什么这个SFTP下载这么慢?,javascript,php,laravel,sftp,Javascript,Php,Laravel,Sftp,我在单击时有一个下载按钮,下载一个文件大约需要15秒,因为它必须将SFTP导入服务器,找到正确的路径/文件,然后返回响应 <a class="btn btn-primary btn-sm text-primary btn-download-1" onclick="startDownload('1')"><i class="fa fa-download "></i></a> /nodes/
<a class="btn btn-primary btn-sm text-primary btn-download-1" onclick="startDownload('1')"><i class="fa fa-download "></i></a>
/nodes/interface/capture/download
中的后端代码:
public function download_files()
{
$dir = '';
$portNumber = Request::get('port');
$zipMe = false;
$remotePath = "/home/john/logs/".$dir."/";
if (!isset($dir) || $dir == null) {
return redirect()->back()->withInput()->withFlashDanger('SFTP Could not connect.');
}
$acsIp = explode('://', env('ACS_URL'));
$acsIp = explode(':',$acsIp[1])[0];
$sftp = new SFTP($acsIp.':22');
if (!$sftp->login('john', '***')) {
return redirect()->back()->withInput()->withFlashDanger('SFTP Could not connect.');
}
// Get into the Specified Directory
$sftpConn = Storage::disk('sftp');
$SFTPFiles = $sftpConn->allFiles('/'.$dir);
if ( count($SFTPFiles) > 0 ) {
foreach ($SFTPFiles as $file) {
$fileName = $file;
break;
}
} else {
\Log::info('Files Not found in the Remote!');
return redirect()->back()->withInput()->withFlashDanger('Files Not found in the Remote!');
}
// Create and give 777 permission to remote-files directory
if (!is_dir(public_path('remote-files/'.$dir))) {
mkdir(public_path('remote-files/'.$dir), 0777, true);
}
$filesToZip = [];
foreach ( $SFTPFiles as $fileName ) {
if ( $fileName == '..' || $fileName == '.' ) {
continue;
} else if ( $fileName == '' ) {
\Log::info('File not found');
continue;
}
$fileName = explode("/", $fileName);
$onlyFileName = (!empty($fileName) && isset($fileName[1])) ? $fileName[1] : "";
$filepath = $remotePath.$onlyFileName;
if (strpos($onlyFileName , $portNumber) !== false) {
// Download the remote file at specified location in Local
if (!$sftp->get($filepath, 'remote-files/'.$dir.'/'.$onlyFileName))
{
die("Error downloading file ".$filepath);
}
$file = public_path('remote-files/'.$dir.'/').$onlyFileName;
$headers = array(
'Content-Description: File Transfer',
'Content-Type: application/octet-stream',
'Content-Disposition: attachment; filename="'.basename($file).'"',
'Cache-Control: must-revalidate',
'Pragma: public',
'Content-Length: ' . filesize($file)
);
return Response::download($file, $onlyFileName, $headers);
}
// IF File is exists in Directory
if ( file_exists( public_path('remote-files/'.$dir.'/').$onlyFileName ) ) {
$filesToZip[] = public_path('remote-files/'.$dir.'/').$onlyFileName;
\Log::info('File Generated '.'remote-files/'.$dir.'/'.$onlyFileName);
// Remove Files from public/remote-files
$this->removeDirAndFiles('', public_path('remote-files/'.$dir));
exit;
} else {
\Log::info('File not Generated '.'remote-files/'.$dir.'/'.$onlyFileName);
}
}
}
这段代码确实有效,但大约需要15秒,这对于用例来说太长了
有没有办法加快速度?我的代码是否有问题,或者这是意料之中的事?我应该考虑切换到SCP吗?我应该重新考虑身份验证吗?我更改了您的函数以测量不同部分的时间,这样您就可以通过查看此字符串“##[time]--”的日志来了解哪个部分减慢了应用程序的速度
您是否在代码中的任何位置设置了
$dir
变量?因为就我读它的方式而言,它唯一的内容是,而且永远是,一个空字符串
在其他浏览器中也需要很长时间吗?按下按钮后,浏览器检查器的“网络”选项卡中是否会弹出任何值得注意的内容
此外,也许您可以尝试将函数放在按钮元素中,而不是超链接中也许这个延迟是浏览器内部的某种超时,因为它希望加载另一个页面 因此,与其使用按钮的超链接,我建议尝试一下:
<button class="btn btn-primary btn-sm text-primary btn-download-1" onclick="startDownload('1')"><i class="fa fa-download "></i></button>
我很想知道会发生什么事。
让我们不断更新 您要下载的文件大小是多少?我不知道你是否也面临同样的问题,但不管怎样,看看吧。它的时间都花在哪里了?打开SFTP连接?实际传输文件?档案有多大?您获得的速率(每秒字节数)是多少?文件大小是4kb。如何调试在哪里花费时间?我如何检查传输速率?为什么不使用SFTP随时间或仅差分时间记录每个操作,您将看到每个操作的影响。另外,
$dir
为空,因此远程路径有两个斜杠。@cyber8200用于以这种方式测量时间do,在脚本do$start=time()的开头;在执行过程中,您可以执行$mid=time()$花费的时间=$mid-$start;这将为您提供从$start到$mid的秒数,依此类推,您可以迭代以查看哪个间隔花费了大量时间
public function download_files()
{
$start = time();
$dir = '';
$portNumber = Request::get('port');
$zipMe = false;
\Log::info("### [TIME] -- t1 = " . (time() - $start));
$remotePath = "/home/john/logs/".$dir."/";
if (!isset($dir) || $dir == null) {
return redirect()->back()->withInput()->withFlashDanger('SFTP Could not connect.');
}
$acsIp = explode('://', env('ACS_URL'));
$acsIp = explode(':',$acsIp[1])[0];
$t1 = time();
$sftp = new SFTP($acsIp.':22');
$t2 = time();
\Log::info("### [TIME] -- SFTP Instantiation took " . ($t2 - $t1) . " secs");
if (!$sftp->login('john', '***')) {
return redirect()->back()->withInput()->withFlashDanger('SFTP Could not connect.');
}
$t1 = time();
// Get into the Specified Directory
$sftpConn = Storage::disk('sftp');
$SFTPFiles = $sftpConn->allFiles('/'.$dir);
$t2 = time();
\Log::info("### [TIME] -- SFTPFiles list took " . ($t2 - $t1) . " secs");
// this loop is not clear to me, you basically take the first element and
// exit the loop
if ( count($SFTPFiles) > 0 ) {
foreach ($SFTPFiles as $file) {
$fileName = $file;
break;
}
} else {
\Log::info('Files Not found in the Remote!');
return redirect()->back()->withInput()->withFlashDanger('Files Not found in the Remote!');
}
$t1 = time();
// Create and give 777 permission to remote-files directory
if (!is_dir(public_path('remote-files/'.$dir))) {
mkdir(public_path('remote-files/'.$dir), 0777, true);
}
$t2 = time();
\Log::info("### [TIME] -- Directory creation took " . ($t2 - $t1) . " secs");
$filesToZip = [];
$t1 = time();
foreach ( $SFTPFiles as $fileName )
{
$start_loop_time = time();
\Log::info("### [TIME] -- Loop for $fileName took " . (time() - $t1) . " secs");
if ( $fileName == '..' || $fileName == '.' ) {
continue;
} else if ( $fileName == '' ) {
\Log::info('File not found');
continue;
}
$fileName = explode("/", $fileName);
$onlyFileName = (!empty($fileName) && isset($fileName[1])) ? $fileName[1] : "";
$filepath = $remotePath.$onlyFileName;
if (strpos($onlyFileName , $portNumber) !== false) {
$responseCreationStart = time();
// Download the remote file at specified location in Local
if (!$sftp->get($filepath, 'remote-files/'.$dir.'/'.$onlyFileName))
{
die("Error downloading file ".$filepath);
}
$file = public_path('remote-files/'.$dir.'/').$onlyFileName;
$headers = array(
'Content-Description: File Transfer',
'Content-Type: application/octet-stream',
'Content-Disposition: attachment; filename="'.basename($file).'"',
'Cache-Control: must-revalidate',
'Pragma: public',
'Content-Length: ' . filesize($file)
);
$responseCreationEnd = time();
\Log::info("### [TIME] -- Response creation took " . ($responseCreationEnd - $responseCreationStart ) . " secs");
return Response::download($file, $onlyFileName, $headers);
}
// IF File is exists in Directory
if ( file_exists( public_path('remote-files/'.$dir.'/').$onlyFileName ) ) {
$t3 = time();
$filesToZip[] = public_path('remote-files/'.$dir.'/').$onlyFileName;
\Log::info('File Generated '.'remote-files/'.$dir.'/'.$onlyFileName);
// Remove Files from public/remote-files
$this->removeDirAndFiles('', public_path('remote-files/'.$dir));
$t4 = time();
\Log::info("### [TIME] -- Deletion took " . ($t4 - $t3) . " secs");
exit;
} else {
\Log::info('File not Generated '.'remote-files/'.$dir.'/'.$onlyFileName);
}
\Log::info("### [TIME] -- Loop end reached in " . (time() - $start_loop_time ) . " secs");
}
}
<button class="btn btn-primary btn-sm text-primary btn-download-1" onclick="startDownload('1')"><i class="fa fa-download "></i></button>