【发布时间】:2014-01-26 16:16:09
【问题描述】:
我有一个 PHP 服务器,它通过从不公开的 FTP 服务器流式传输音频文件来提供音频文件。
发送适当的标头后,我只需使用ftp_get 将文件流式传输到客户端,如下所示:
ftp_get($conn, 'php://output', $file, FTP_BINARY);
由于与Range 标头有关的原因,我现在必须提出只发送此流的一部分:
$start = 300; // First byte to stream
$stop = 499; // Last byte to stream (the Content-Length is then $stop-$start+1)
我可以通过将整个内容临时下载到文件/内存中来做到这一点,然后将所需的部分发送到输出。但是由于文件很大,该解决方案会导致客户端延迟,因为客户端必须等待文件首先下载到 PHP 服务器,然后才能开始下载到客户端。
问题:
如何在第一个 $start 字节被丢弃后立即从 FTP 服务器开始流式传输到 php://output 并在达到“$stop”字节时停止流式传输?
【问题讨论】:
-
ftp_nb_get(),它的最后一个参数$resumepos和ftp_nb_continue()可能有用。 -
@user555 我错过了 $resumepos!是的,它肯定有助于我处理我的起点。它不允许我下载一定数量的字节。
-
在
while ($ret == FTP_MOREDATA)循环中,也许您可以以某种方式计算接收到的字节数,但是PHP 文档没有提到每个ftp_nb_continue()下载了多少字节。如果我必须通过查看 FTP 扩展 source code 来猜测,我会说ftp_nb_continue()下载的字节数与FTP_BUFSIZE设置的一样多,默认为 4096。为了完全控制,我认为最好自己扮演角色PHP 中的 FTP 客户端,使用REST并计算接收到的字节数。 -
@user555 我能够让它工作:)。你可以看到我的回答我是如何做到的。感谢您的建议!