繁体   English   中英

使用PHP通过SFTP传输文件以进行下载非常慢

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM