2014-07-16 8 views
0

내 웹 서버가 사용자가 나중에 다운로드 할 수 있도록 서버에서 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 스크립트입니다. 이 속도 저하의 원인은 무엇일까요?

+1

SFTP는 암호화를 추가하여 성능상의 불이익을 초래합니다. 또한'phpseclib'는 "순수한 PHP 구현"이라고 생각합니다. OpenSSL이나 [LibreSSL] (http://www.libressl.org/)과 같은 네이티브 (C) 구현보다 항상 느리게 진행될 것입니다. –

+0

@JonathonReinhart 암호화 기능을 추가하지 않는 기능을 지정하는 방법이 있습니까? 또는 동일한 라이브러리를 사용하여 암호화를 사용하지 않는 다른 파일 전송 방법을 사용할 수 있습니까? 전송되는 파일의 종류에 대한 정보 보안은 여기에서 그다지 중요하지 않습니다. – Choub890

+0

다른 많은 방법이 있습니다. HTTP와 FTP가 떠오른다. 그러나 적절한 인증을 사용하여 안전한 방법을 사용하는 것이 좋습니다. –

답변

1

phpseclib는 사용 가능한 경우 mcrypt를 사용하며, 그렇지 않은 경우 자체 pure PHP 구현입니다. phpinfo()을하면 mcrypt가 설치되어 있습니까?

또한 SSH2는 다양한 암호화 알고리즘을 지원하며 일부는 다른 것보다 빠릅니다. phpseclib를 비교하는 클라이언트가 phpseclib가 구현 한 것보다 더 빠른 알고리즘을 사용하고있을 수 있습니다.

마지막으로, 사용중인 phpseclib의 버전은 무엇입니까? 최신은 0.3.7입니다.

+0

phpseclib를 사용하는 이유는 서버의 시스템 관리자가 우리가 거기에 아무 것도 설치하지 않기를 원하기 때문입니다. phpseclib는 이식성이 있기 때문에 (설치할 필요가없고, 파일을 사용할 때 파일을 포함 할 필요가 있습니다), 이것이 우리가 함께 간 이유입니다. mcrypt가 정말 속도면에서 도움이 될까요? 그렇다면 sys 관리자가 서버에 설치할 수 있도록 필요한 인수를 내게 줄 수 있습니다. 우리가 설치한다면 나중에 phpseclib가 자체 구현 대신 mcrypt를 사용하기 위해 필요한 구성이 있습니까? – Choub890

+1

mcrypt를 사용 중지하면 http://phpseclib.sourceforge.net/crypt/examples.html에 게시 된 것보다 속도가 약간 더 좋아집니다 (1MB의 경우 0.84 초). mcrypt는 0.06 초입니다. 따라서 phpseclib의 순수 PHP 구현이 가장 빠 른 순수 PHP 구현 인 경우에도 mcrypt는 여전히 물 밖으로 불어옵니다. mcrypt는 매우 광범위하게 배포되며 (libssh2보다 훨씬 더) 어떤 구성도 필요하지 않습니다. sudo apt-get 또는 sudo yum을 실행하면 제대로 작동합니다! 솔직히 mcrypt가 설치되어 있지 않다는 것은 조금 놀랍습니다. 일반적으로 설치되는 방법은 lol입니다. – neubert