gpt4 book ai didi

PHP readfile 文件的大小正在增加

转载 作者:可可西里 更新时间:2023-11-01 13:28:25 25 4
gpt4 key购买 nike

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

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

上述过程使用的查询是这样的:

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 的评论,我正在尝试实现这一点,而不必让用户等待..所以这不是一个选择。

最佳答案

由于您正在处理流,您可能应该使用流处理函数:)。 passthru想到了,虽然这只有在 download | transcode 命令在您的脚本中启动。

如果是外部启动的,看一下stream_get_contents .

关于PHP readfile 文件的大小正在增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14546723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com