加快 op phpseclib sftp 下载远程文件的方法



所以我使用phpseclib,它在大约45秒内通过sftp下载一个50MB的文件。与需要 90+ 秒的 ssh2_scp_recv() 相比,这很快,但与我的 sftp 客户端 (filezilla) 相比很慢,最多需要 10 秒。

我的问题是,除了启用我已经完成的mcrypt,gmp和bcmath扩展之外,我还能做些什么来加快通过sftp的文件下载速度?

我在 Windows 7 上运行 PHP 5.5,在使用 cli 或浏览器/apache 以及使用 sftp->get 下载整个文件或下载各种大小的文件块时,得到了相同的结果。

源:

set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');
require 'phpseclib/Net/SFTP.php';
$sftp = new Net_SFTP($host, $port, $timeout);
$sftp->login($user, $password);
$sftp->get($remoteFile, $localFile);
使用

SFTP 协议,客户端(客户端库)反复使用"READ"请求来获取文件内容块。

phpseclib 使用的一个愚蠢的实现,发送一个"READ"请求(最多 32 kB),等待"DATA"响应,发送另一个"READ"请求,等待,依此类推,直到它得到一个完整的文件。

如果往返服务器的往返时间很长(延迟很大),则客户端(库)可能大部分时间都在无用地等待。

智能客户端(库)通过发送多个"READ"请求来克服此问题,而无需等待响应,或者使用大型"READ"请求,或两者兼而有之。

例如,FileZilla发送一系列32 kB的"READ"请求,总共最多1 MB的数据。

phpseclib 不支持此优化(请注意,它适用于上传)。

您所能做的就是使用 Net_SFTP::max_sftp_packet 增加"READ"请求的大小。

最新更新