我希望能够从服务器通过SFTP获取文件,以便我的Web服务器允许用户随后下载它。为实现这一目标,我使用的是phpseclib库。不幸的是,这真的很慢,因为当我从托管原始文件的服务器直接下载之前我可以达到超过1mb / s时,我只能达到300-350kb / s的速度。由于我们公司的一些内部原因,我们必须将这些文件重新定位在仅打开端口22的其他服务器上,因此当用户访问以下链接时:http://my.website.com/some/path/getfile/getfile.php?filename=someFileName.extension
我的php脚本通过SSH连接到服务器托管文件,然后将指定的文件下载到php://output
流,供用户下载。
这是我的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');
}
虽然如上所述,它确实很慢。什么可能导致这种减速?
答案 0 :(得分:1)
phpseclib使用mcrypt,如果它可用,否则它是自己的纯PHP实现。如果您执行phpinfo()
,您是否看到安装了mcrypt?
此外,SSH2支持多种加密算法,有些加密算法比其他算法更快。可能是你正在比较phpseclib的客户端只是使用比phpseclib实现的更快的算法。
最后,您使用的是什么版本的phpseclib?最新的是0.3.7。