PHP - SSH2 SFTP 下载进度

7

我认为这个问题很值得提出,因为StackOverflow上似乎没有足够的相关内容。

我想使用带有进度条的PHP进行SFTP传输

我喜欢进度条。但是,这次我想做一些不同的事情。我想要使用PHP做到以下几点,这看起来比上一次难得多:

  • 通过SFTP(通过SSH?)执行下载
  • 为用户提供可见的下载进度指示
  • 启用暂停和继续下载

类似于FileZilla,但在浏览器中使用PHP构建。我不想攻击Apache或添加任何Apache模块。


实际下载的选项

关于基本的SFTP下载,这里很多问题。

这些文档涉及PHP的SSH2扩展(我目前正在使用 - 您可以通过pecl安装它)和另一种选择PHPSecLib,虽然我现在没有使用,但以后可能会考虑。
我的接口允许轻松添加/删除 - 面向接口编程等...

这很好,但它们只执行实际下载,仅此而已。

下载进度

PHP有一个非常有趣的回调函数叫做stream_notification_callback您可以在这里了解更多信息

这看起来很棒,是一个很有前途的步骤,直到有人查看了PHP的源代码,并发现SSH2 / SFTP不允许与此集成
感谢hek2mgl的努力研究。

stream_notification_callback的想法是,在每次检索数据时传递当前下载大小的通知;因此,使用当前下载量和总文件大小计算百分比所需的数据就得到了。但是这并不适用于SSH2和SFTP...

那么暂停/继续呢?

在我看来,这可能是最难实现的。将数据下载到临时文件是可能的...这是我找到的资料:http://ee.php.net/manual/en/function.fread.php#84115 - 但将这种代码与进度条集成起来似乎很疯狂。

最后

还有cURL,但我没有看到通过SFTP实现下载暂停/恢复的可能性。如果我错了,请纠正我。
那么,如何使用PHP在浏览器中整合上述要求?忘记客户端的东西,只要将数据传输到浏览器就足够了,所以建议执行此操作会很好。

4
研究!它有研究! - Madara's Ghost
我认为你可以通过使用操作系统内置的sftp客户端(或者其他你选择的客户端),启用详细日志记录,然后通过php读取日志来实现你需要的功能。这不是一个完整的php解决方案,但它简单、流畅且相当容易实现。 - Iesus Sonesson
2个回答

2

下面是我从这个网站找到的一个示例:

    // Write from our remote stream to our local stream
    $read = 0;
    $fileSize = filesize("ssh2.sftp://$sftp/$fileName");
    while ($read < $fileSize && ($buffer = fread($remoteStream, $fileSize - $read))) {
        // Increase our bytes read
        $read += strlen($buffer);

        // Write to our local file
        if (fwrite($localStream, $buffer) === FALSE) {
            throw new Exception("Unable to write to local file: /localdir/$fileName");
        }
    }

由于您已经拥有文件的大小并使用fread从中读取,因此确定进度非常简单。

暂停可以通过检查来自APC的值来完成,例如,如果用户单击“暂停”按钮,则设置该值(在iframe中执行此操作,以便不会停止主脚本)。


1

查看使用PHP下载大文件时服务器失败。这可能会给你一些想法。

总结一下...其中一个答案建议修改phpseclib,以便在接收到每个块时回显数据。另一个答案建议只下载块并在下载它们时输出这些块。

看起来这与您使用stream_notification_callback的想法非常一致。

祝你好运!


我考虑按照文件总大小的比例分批读取数据,从而给出大致的百分比。这也可以允许暂停/继续。我会研究一下,谢谢! - Jimbo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接