2

NET_SFTP_STATUS_EOF: End of file对于使用 phpseclib 从特定 SFTP 服务器下载的任何文件,我都会收到错误消息。尽管我认为它没有任何解决方案,但在这里提出了类似的问题。

奇怪的是,所有文件似乎都正确导入并具有相同的文件大小,但是,仍然会产生错误,这让我有点担心,因为正确导入这些文件至关重要。

我正在使用最新版本的 phpseclib 和 PHP 7.3。我已经附加了我要在此处下载的文件(似乎可以正确下载但会产生此错误)以及使用define('NET_SSH2_LOGGING', 3) 此处的 SFTP 转储。

任何有关为什么 phpseclib 产生此错误的帮助将不胜感激。

4

1 回答 1

0

这不是问题。

phpseclib 以 32kb 的块下载文件。SFTP 客户端发送的每个下载请求都会跟进来自 SFTP 服务器的下载响应。为了加快速度,phpseclib 发送 32x 下载请求,然后读取 32x 下载响应。事实证明,这比交错它们更快(例如,发送 1x 下载请求并读取 1x 下载响应)。这可以通过NET_SFTP_QUEUE_SIZE常量进行配置。

32kb x 32 = 1mb。所以基本上 phpseclib 以 1mb 为单位发送下载请求。如果文件不在x mb - 32kb和 x mb 之间(其中 x 是整数),那么最后一批 32x 下载请求将太多。

理论上 phpseclib 可以在下载文件之前查看文件的大小,以便最后一批的下载请求数是准确的,但是如果您是从设备下载的呢?例如。/dev/null还是/dev/urandom什么?此时stat会说文件大小为0。

phpseclib 所做的不是查看文件大小,而是读取直到响应不是下载响应而是下载“状态”。例如。“文件结束”。

我可以继续解释为什么下载请求是 32kb 而不是其他大小,或者为什么一次只下载 32x(相对于 64 或其他),但是,足以说,这是预期的行为,没什么好担心的。

于 2020-07-01T08:01:55.480 回答