PHP代码是在页眉还是页脚有关系吗?


Does it matter whether PHP code is in header or footer?

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服务器