2011-09-05 104 views
5

PHP是否在處理文件時發送代碼,還是構成整個HTML響應,然後發送它?例如,將昂貴的PHP函數移動到服務器上的文件頁腳上會有什麼區別?PHP代碼是在頁眉還是頁腳?

另外,如果您使用Transfer-Encoding: chunked,它會有什麼區別嗎?

回答

3

最終,這取決於。我使用的大多數PHP託管機制都會以塊的形式傳輸響應,因爲它是從腳本接收到的,因此完全省略了標頭(因爲事先不知道)。您可以定期使用flush()刷新響應,以強制服務器將迄今已緩衝的內容傳輸到客戶端。

因此,如果您要做的事情需要花費很多時間並且希望事先渲染頁面,那麼正確的方法是輸出儘可能多的頁面,調用flush(),然後做你的昂貴任務。只要確保不要超過聲明的最大PHP腳本持續時間。


好了,這樣的解釋固然有點簡單化:

Content-Length頭實際上可能會在某些情況下被髮送。例如,如果腳本的響應小於PHP發送數據的緩衝區,並且/或者腳本在一定的時間內執行,則服務器將確切知道內容的長度,並且可以添加長度標題。

此外,flush()實際上可能沒有做任何事情。這取決於您的服務器配置和其他因素。特別注意的文檔中,這些警告關於服務器端的行爲:

的flush()可能無法覆蓋您的Web服務器的緩存模式,它有瀏覽器中的任何客戶端緩存沒有影響。它也不影響PHP的用戶空間輸出緩衝機制。這意味着如果使用這些緩衝區,則必須調用ob_flush()和flush()來刷新ob輸出緩衝區。

幾臺服務器,尤其是Win32上的服務器,仍然會緩存腳本的輸出,直到將結果傳輸到瀏覽器之前終止。

像Apache等mod_gzip服務器模塊可能會做自己的緩衝,這將導致flush()不會導致數據立即發送到客戶端。

換句話說:測試,測試,測試。確保Web服務器不干擾您嘗試實現的行爲。必要時重新配置Web服務器。

+0

很好的答案,謝謝! –