PHP是在处理文件时发送代码,还是编写整个HTML响应然后发送?例如,将昂贵的PHP函数移到服务器上的文件页脚中会有什么不同吗?
另外,如果您使用Transfer-Encoding: chunked
,会有什么不同吗?
最终,这取决于。我所使用的大多数PHP托管机制都会在从脚本接收响应时以块的形式对响应进行流处理,完全省略了Content-Length
标头(因为事先不知道这一点)。您可以使用flush()
定期刷新响应,以强制服务器将迄今为止缓冲的内容传输到客户端。
因此,如果您要做的事情需要花费很多时间,并且希望允许页面提前呈现,那么正确的方法是输出尽可能多的页面,调用flush()
,然后执行昂贵的任务。只要确保不要超过声明的最大PHP脚本持续时间。
好吧,我承认这个解释有点过于简化了:
Content-Length
报头实际上可能在某些情况下被发送。例如,如果脚本的响应小于PHP发送数据的缓冲区,和/或如果脚本执行所需的时间少于一定数量,那么服务器将确切地知道内容的长度,并可以添加长度头。
进一步,flush()
可能实际上不做任何事情。这取决于您的服务器配置和其他因素。在文档中特别注意这些关于服务器端行为的警告:
flush()可能无法覆盖web服务器的缓冲方案,并且它对浏览器中的任何客户端缓冲都没有影响。它也不会影响PHP的用户空间输出缓冲机制。这意味着如果您正在使用ob_flush()和flush(),则必须同时调用ob_flush()来刷新ob输出缓冲区。
一些服务器,特别是在Win32上,仍然会缓冲脚本的输出,直到它在将结果传输到浏览器之前终止。
Apache的服务器模块,如mod_gzip,可能会做自己的缓冲,这将导致flush()不会立即将数据发送到客户端。
换句话说:测试,测试,测试。确保web服务器没有干扰你想要实现的行为。如果需要,重新配置web服务器