내 웹 서버가 사용자가 나중에 다운로드 할 수 있도록 서버에서 SFTP를 통해 파일을 가져올 수 있기를 원합니다. 이를 위해 phpseclib 라이브러리를 사용하고 있습니다. 불행히도 원본 파일을 호스팅하는 서버에서 직접 다운로드하기 전에 1MB/s 이상을 달성 할 수있을 때만 300-350kb/s의 속도를 얻을 수 있기 때문에이 속도는 정말 느립니다. 우리 회사의 내부 사정으로 인해 포트 22가 열려있는 다른 서버에서 파일을 재배치해야하므로 사용자가 다음 링크를 클릭 할 때 http://my.website.com/some/path/getfile/getfile.php?filename=someFileName.extension
내 PHP 스크립트는 SSH를 통해 파일을 호스트하는 서버에 연결합니다 , 사용자가 다운로드 할 수 있도록 지정된 파일을 php://output
스트림으로 다운로드합니다. 같은 정말 느린 언급하지만,PHP가 매우 느린 SFTP를 통해 다운로드 할 파일을 전송하는 중
error_reporting(E_ERROR);
include('Net/SFTP.php');
include('Crypt/RSA.php');
if (!isset($_GET['filename']))
die();
# This if statement is there as a layer of protection to prevent users from going elsewhere
# in the filesystem of the server.
if (!strpos($_GET['filename'], '..') and !strpos($_GET['filename'], '/') and !strpos($_GET['filename'], '\\')) {
$sftp = new Net_SFTP('my.website.com');
$key = new Crypt_RSA();
$key->loadkey(file_get_contents('key.pvt'));
if (!$sftp->login('loginUserName', $key)) {
exit('Login Failed');
}
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.$_GET['filename']);
header('Content-Transfer-Encoding: binary');
header('Cache-Control: must-revalidate');
header('Accept-Ranges: bytes');
header('Expires: 0');
header('Pragma: public');
header('Content-Length: ' . $sftp->size('transfer/'.$_GET['filename']));
ob_clean();
flush();
set_time_limit(3600);
$sftp->get('transfer/'.$_GET['filename'], 'php://output');
}
이 작동 :
여기 내 PHP 스크립트입니다. 이 속도 저하의 원인은 무엇일까요?
SFTP는 암호화를 추가하여 성능상의 불이익을 초래합니다. 또한'phpseclib'는 "순수한 PHP 구현"이라고 생각합니다. OpenSSL이나 [LibreSSL] (http://www.libressl.org/)과 같은 네이티브 (C) 구현보다 항상 느리게 진행될 것입니다. –
@JonathonReinhart 암호화 기능을 추가하지 않는 기능을 지정하는 방법이 있습니까? 또는 동일한 라이브러리를 사용하여 암호화를 사용하지 않는 다른 파일 전송 방법을 사용할 수 있습니까? 전송되는 파일의 종류에 대한 정보 보안은 여기에서 그다지 중요하지 않습니다. – Choub890
다른 많은 방법이 있습니다. HTTP와 FTP가 떠오른다. 그러나 적절한 인증을 사용하여 안전한 방법을 사용하는 것이 좋습니다. –