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

时间:2014-07-16 17:37:19

标签: php web ssh sftp phpseclib

我希望能够从服务器通过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');
}

虽然如上所述,它确实很慢。什么可能导致这种减速?

1 个答案:

答案 0 :(得分:1)

phpseclib使用mcrypt,如果它可用,否则它是自己的纯PHP实现。如果您执行phpinfo(),您是否看到安装了mcrypt?

此外,SSH2支持多种加密算法,有些加密算法比其他算法更快。可能是你正在比较phpseclib的客户端只是使用比phpseclib实现的更快的算法。

最后,您使用的是什么版本的phpseclib?最新的是0.3.7。