2014-07-16 125 views
0

我希望能夠通過SFTP從服務器獲取文件,以便我的Web服務器允許用戶下載它之後。爲了達到這個目的,我使用了phpseclib庫。不幸的是,這是非常慢的,因爲我只能達到300-350kb/s的速度,當我可以達到超過1mb/s之前直接從託管原始文件的服務器上下載。由於我們公司的一些內部原因,我們必須將這些文件重新定位到只有端口22打開的其他服務器上,因此當用戶進入以下鏈接時:http://my.website.com/some/path/getfile/getfile.php?filename=someFileName.extension我的php腳本通過SSH連接到承載文件的服務器,然後將指定的文件下載到php://output流供用戶下載。傳輸文件通過SFTP與PHP下載很慢

這裏是我的PHP腳本:

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'); 
} 

這工作,但正如提到實在是太慢了。什麼可能導致這種放緩?

+1

SFTP增加加密,這會導致一些性能損失。還要考慮到'phpseclib'是一個「純PHP實現」,它總是比本地(C)實現(比如OpenSSL或[LibreSSL](http://www.libressl.org/))慢。 –

+0

@JonathonReinhart會有一種方法可以指定函數不添加加密嗎?或者,使用相同的庫,我可以使用另一種不使用加密的文件傳輸方法嗎?這裏傳輸的文件的信息安全並不是非常重要。 – Choub890

+0

還有很多其他的方法。想到HTTP和FTP。但我會建議使用安全的方法與適當的身份驗證無論如何。 –

回答

1

如果可用,phpseclib使用mcrypt,否則它是自己的純PHP實現。如果你做phpinfo()你看到mcrypt安裝嗎?

此外,SSH2支持多種加密算法,其中一些比其他加密算法快。可能是因爲您正在比較phpseclib的客戶端僅使用比phpseclib實現的更快的算法。

最後,您使用的是哪個版本的phpseclib?最新的是0.3.7。

+0

我們使用phpseclib的原因是服務器的系統管理員不希望我們在那裏安裝任何東西。由於phpseclib是可移植的(不需要安裝它,只需在包含文件的時候使用它),這就是我們爲什麼要使用它的原因。 mcrypt真的會幫助速度嗎?如果是這樣,它可能會給我的參數,我需要讓系統管理員在服務器上安裝它。如果我們安裝它,以後是否需要配置phpseclib來使用mcrypt而不是自己的實現? – Choub890

+1

在禁用mcrypt的情況下,我獲得的速度稍微好於http://phpseclib.sourceforge.net/crypt/examples.html上發佈的內容 - 1mb爲0.84s。用mcrypt它是0.06秒。因此,即使phpseclib的純PHP實現是最快的*純PHP *實現,mcrypt仍然會將它吹出水面。 mcrypt的部署非常廣泛(比libssh2多得多),並且不需要任何配置。只要做sudo apt-get或sudo yum就行了!老實說,你沒有安裝mcrypt有點令人驚訝,因爲它通常安裝了大聲笑 – neubert