使用 readfile() 时——在 Apache 上使用 PHP——是文件立即读入 Apache 的输出缓冲区并且 PHP 脚本执行完成,还是 PHP 脚本执行等到客户端完成下载文件(或服务器超时,以先发生者为准)?
更长的背景故事:
我有一个网站,里面有很多大型 mp3 文件(当地教堂的布道)。并非音频存档中的所有文件都允许下载,因此 /sermon/{filename}.mp3 路径被重写以真正执行 /sermon.php?filename={filename} 如果允许下载文件,则内容类型设置为“audio/mpeg”并使用 readfile() 流式传输文件。我一直在抱怨(几乎完全来自通过 3G 传输下载的 iPhone 用户)文件没有完全下载,或者在大约 10 或 15 分钟后被切断。当我从使用 readfile() 流式传输文件切换到简单地重定向到文件时 -- header("Location: $file_url"); ——所有的抱怨都消失了(我什至检查了一些以前可以可靠地按需重现问题的用户)。
这让我怀疑在使用 readfile() 时,PHP 脚本引擎一直在使用,直到文件完全下载,但我找不到任何证实或否认这一理论的参考资料。我承认我在 ASP.NET 世界中更加自如,与 readfile() 等效的 dotNet 立即将整个文件推送到 IIS 输出缓冲区,因此 ASP.NET 执行管道可以独立于文件的传递完成到最终客户端... PHP + Apache 是否有与此行为等效的方法?