[英]Transfering file for download through SFTP with PHP very slow
我希望能够通过SFTP从服务器获取文件,以便我的Web服务器允许用户随后下载它。 为此,我正在使用phpseclib库。 不幸的是,这确实很慢,因为当我从托管原始文件的服务器直接下载之前,我只能达到300-350kb / s的速度,而我可以达到1mb / s以上的速度。 由于公司内部的某些原因,我们必须将这些文件重新定位在仅打开端口22的其他服务器上,因此当用户进入以下链接时: http://my.website.com/some/path/getfile/getfile.php?filename=someFileName.extension
: 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');
}
这行得通,尽管如上所述,它确实很慢。 是什么原因导致这种速度下降?
phpseclib使用mcrypt(如果可用),否则使用纯PHP实现。 如果执行phpinfo()
,会看到安装了mcrypt吗?
另外,SSH2支持多种加密算法,其中一些比其他算法更快。 可能是您要比较phpseclib的客户端只是使用比phpseclib实现的算法更快的算法。
最后,您使用的是哪个版本的phpseclib? 最新的是0.3.7。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.