【发布时间】:2012-07-31 23:19:11
【问题描述】:
当使用 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 世界中更自在,dotNet 等效于 readfile() 立即将整个文件推送到 IIS 输出缓冲区,因此 ASP.NET 执行管道可以独立于文件的传递完成到最终客户端... PHP+Apache 是否有与此行为等效的方法?
【问题讨论】:
-
您是否尝试在使用 readfile 时禁用 php 执行时间限制?这也可以回答您的问题 - 如果您允许无限的执行时间并且 readfile 版本不会中止,那么您就有了答案。
-
我在共享主机环境中运行,因此我认为无法更改此类设置。在进行更多阅读时,看起来使用 PHP 读取文件以输出的所有可能方式都会让脚本一直运行,直到下载完成。如果我想要“在 Web 服务器处理将文件获取到客户端时刷新并完成执行”功能,看起来我需要将其重新编写为 ASP.NET 应用程序。