所以我使用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"请求的大小。