PHP readfile文件的大小越来越大

Sat*_*ram 6 php ffmpeg wget download readfile

是否可以在远程文件上使用PHP readfile函数,该文件的大小未知且大小正在增加?这是场景:

我正在开发一个脚本,从第三方网站下载视频,同时将视频转码为MP3格式.然后通过readfile将此MP3传送给用户.

用于上述过程的查询如下:

wget -q -O- "VideoURLHere" | ffmpeg -i - "Output.mp3" > /dev/null 2>&1 &
Run Code Online (Sandbox Code Playgroud)

因此,文件同时被提取和编码.现在,当上述过程正在进行中时,我开始通过readfile将输出mp3发送给用户.问题是编码过程需要一些时间,因此取决于用户下载速度,readfile在整个文件被编码之前达到假定的EoF,导致用户接收部分内容/不完整文件.

我第一次尝试修复此问题是对用户下载应用速度限制,但这并非万无一失,因为编码时间和速度因负载而异,这仍然会导致部分下载.

那么有没有办法以这样的方式实现这个系统,我可以同时提供下载和编码,并保证将完整的文件发送给最终用户?

任何帮助表示赞赏.

编辑:回应彼得,我实际上正在使用fread(读取readfile_chunked):

 <?php
 function readfile_chunked($filename,$retbytes=true) {
            $chunksize = 1*(1024*1024); // how many bytes per chunk
            $totChunk = 0;
            $buffer = '';
            $cnt =0;
            $handle = fopen($filename, 'rb');
            if ($handle === false) {
                return false;
            }
            while (!feof($handle)) {
                //usleep(120000); //Used to impose an artificial speed limit
                $buffer = fread($handle, $chunksize);
                echo $buffer;
                ob_flush();
                flush();
                if ($retbytes) {
                    $cnt += strlen($buffer);
                }
            }
                $status = fclose($handle);
            if ($retbytes && $status) {
                return $cnt;        // return num. bytes delivered like readfile() does.
            }
            return $status;
        }
        readfile_chunked($linkToMp3);
    ?>
Run Code Online (Sandbox Code Playgroud)

这仍然不能保证完全下载,因为取决于用户下载速度和编码速度,可能过早地达到EOF().

也是为了回应杰茨的评论,我试图在不必让用户等待的情况下实现这一目标.所以这不是一个选择.

Eve*_*ert -1

我强烈建议对此类应用程序使用 libevent。

它非常适合这样的情况。

PHP 文档对此有点稀疏,但您应该能够在网络上找到更可靠的示例。