我希望能夠通過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');
}
這工作,但正如提到實在是太慢了。什麼可能導致這種放緩?
SFTP增加加密,這會導致一些性能損失。還要考慮到'phpseclib'是一個「純PHP實現」,它總是比本地(C)實現(比如OpenSSL或[LibreSSL](http://www.libressl.org/))慢。 –
@JonathonReinhart會有一種方法可以指定函數不添加加密嗎?或者,使用相同的庫,我可以使用另一種不使用加密的文件傳輸方法嗎?這裏傳輸的文件的信息安全並不是非常重要。 – Choub890
還有很多其他的方法。想到HTTP和FTP。但我會建議使用安全的方法與適當的身份驗證無論如何。 –