gpt4 book ai didi

PHP readfile() 和大文件

转载 作者:可可西里 更新时间:2023-10-31 22:09:14 28 4
gpt4 key购买 nike

当使用 readfile() 时——在 Apache 上使用 PHP——文件是立即读入 Apache 的输出缓冲区并完成 PHP 脚本执行,还是 PHP 脚本执行等到客户端完成下载文件(或服务器)超时,以先发生者为准)?

较长的背景故事:

我有一个网站,上面有很多大型 mp3 文件(本地教堂的布道)。并非音频存档中的所有文件都允许下载,因此重写/sermon/{filename}.mp3 路径以真正执行/sermon.php?filename={filename} 如果允许下载文件则内容类型设置为“音频/mpeg”,文件使用 readfile() 流出。我一直收到投诉(几乎完全来自通过 3G 流下载的 iPhone 用户)文件没有完全下载,或者他们在大约 10 或 15 分钟后中断。当我从使用 readfile() 流出文件切换到简单地重定向到文件时 -- header("Location: $file_url"); -- 所有的提示都消失了(我什至咨询了一些用户,他们以前可以可靠地按需重现问题)。

这让我怀疑在使用 readfile() 时,PHP 脚本引擎一直在使用,直到文件完全下载,但我找不到任何证实或否认这一理论的引用资料。我承认我在 ASP.NET 世界中更自在,dotNet 等同于 readfile() 立即将整个文件推送到 IIS 输出缓冲区,因此 ASP.NET 执行管道可以独立于文件的传递完成到最终客户端...是否有与 PHP+Apache 的这种行为等效的行为?

最佳答案

你可能还有PHP output buffering在执行 readfile() 时处于事件状态。检查:

if (ob_get_level()) ob_end_clean();

while (ob_get_level()) ob_end_clean();

这样,唯一剩下的输出缓冲区应该是 apache 的输出缓冲区,参见 SendBufferSize用于 apache 调整。

编辑

你也可以看看mod_xsendfile ( an SO post on such usage, PHP + apache + x-sendfile ),这样您只需告诉 Web 服务器您已完成安全检查,现在他可以传送文件了。

关于PHP readfile() 和大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11786734/

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