加快op phpseclib sftp get下载远程文件的方法
Ways to speed op phpseclib sftp get to download remote file
所以我使用 phpseclib,它在大约 45 秒内通过 sftp 下载一个 50MB 的文件。与需要 90 多秒的 ssh2_scp_recv() 相比速度快,但与我的 sftp 客户端 (filezilla) 相比速度较慢,后者最多需要 10 秒。
我的问题是,除了启用我已经完成的 mcrypt、gmp 和 bcmath 扩展之外,我还能做些什么来加快通过 sftp 的文件下载速度?
我在 Windows 7 上运行 PHP 5.5,使用 cli 或 browser/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" 请求,等待,依此类推,直到它得到一个完整的文件。
如果往返 to/from 服务器很长(延迟大),客户端(库)可能大部分时间都在无用地等待。
智能客户端(图书馆)通过发送多个 "READ" 请求而不等待响应,或使用大型 "READ" 请求,或两者兼而有之来克服这个问题。
例如,FileZilla 发送了一个 32 kB 的序列 "READ" 请求,请求总计 1 MB 的数据。
phpseclib 不支持这种优化(注意,它支持上传,不过)。
您所能做的就是增加 "READ" 请求的大小,使用 Net_SFTP::max_sftp_packet
。
所以我使用 phpseclib,它在大约 45 秒内通过 sftp 下载一个 50MB 的文件。与需要 90 多秒的 ssh2_scp_recv() 相比速度快,但与我的 sftp 客户端 (filezilla) 相比速度较慢,后者最多需要 10 秒。
我的问题是,除了启用我已经完成的 mcrypt、gmp 和 bcmath 扩展之外,我还能做些什么来加快通过 sftp 的文件下载速度?
我在 Windows 7 上运行 PHP 5.5,使用 cli 或 browser/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" 请求,等待,依此类推,直到它得到一个完整的文件。
如果往返 to/from 服务器很长(延迟大),客户端(库)可能大部分时间都在无用地等待。
智能客户端(图书馆)通过发送多个 "READ" 请求而不等待响应,或使用大型 "READ" 请求,或两者兼而有之来克服这个问题。
例如,FileZilla 发送了一个 32 kB 的序列 "READ" 请求,请求总计 1 MB 的数据。
phpseclib 不支持这种优化(注意,它支持上传,不过)。
您所能做的就是增加 "READ" 请求的大小,使用 Net_SFTP::max_sftp_packet
。