是否可以在大小未知且大小不断增加的远程文件上使用 PHP readfile 函数?这是场景:
我正在开发一个从第三方网站下载视频并同时将视频转码为 MP3 格式的脚本。然后通过 readfile 将此 MP3 传输给用户。
用于上述过程的查询是这样的:
wget -q -O- "VideoURLHere" | ffmpeg -i - "Output.mp3" > /dev/null 2>&1 &
因此文件被同时获取和编码。现在,当上述过程正在进行时,我开始通过 readfile 将输出 mp3 发送给用户。问题是编码过程需要一些时间,因此根据用户的下载速度,readfile 在整个文件被编码之前达到假定的 EoF,导致用户接收部分内容/不完整的文件。
我第一次尝试解决这个问题是对用户下载应用速度限制,但这并不是万无一失的,因为编码时间和速度会随着负载而变化,这仍然会导致部分下载。
那么有没有办法以这样一种方式来实现这个系统,即我可以同时提供下载和编码,并保证将完整的文件发送给最终用户?
任何帮助表示赞赏。
编辑:作为对彼得的回应,我实际上正在使用 fread(read 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);
?>
这仍然不能保证完全下载,因为根据用户下载速度和编码速度,EOF() 可能会过早到达。
同样为了回应 theJeztah 的评论,我正在尝试实现这一目标,而不必让用户等待......所以这不是一个选择。