PHP是否在處理文件時發送代碼,還是構成整個HTML響應,然後發送它?例如,將昂貴的PHP函數移動到服務器上的文件頁腳上會有什麼區別?PHP代碼是在頁眉還是頁腳?
另外,如果您使用Transfer-Encoding: chunked
,它會有什麼區別嗎?
PHP是否在處理文件時發送代碼,還是構成整個HTML響應,然後發送它?例如,將昂貴的PHP函數移動到服務器上的文件頁腳上會有什麼區別?PHP代碼是在頁眉還是頁腳?
另外,如果您使用Transfer-Encoding: chunked
,它會有什麼區別嗎?
最終,這取決於。我使用的大多數PHP託管機制都會以塊的形式傳輸響應,因爲它是從腳本接收到的,因此完全省略了標頭(因爲事先不知道)。您可以定期使用flush()
刷新響應,以強制服務器將迄今已緩衝的內容傳輸到客戶端。
因此,如果您要做的事情需要花費很多時間並且希望事先渲染頁面,那麼正確的方法是輸出儘可能多的頁面,調用flush()
,然後做你的昂貴任務。只要確保不要超過聲明的最大PHP腳本持續時間。
好了,這樣的解釋固然有點簡單化:
的Content-Length
頭實際上可能會在某些情況下被髮送。例如,如果腳本的響應小於PHP發送數據的緩衝區,並且/或者腳本在一定的時間內執行,則服務器將確切知道內容的長度,並且可以添加長度標題。
此外,flush()
實際上可能沒有做任何事情。這取決於您的服務器配置和其他因素。特別注意的文檔中,這些警告關於服務器端的行爲:
的flush()可能無法覆蓋您的Web服務器的緩存模式,它有瀏覽器中的任何客戶端緩存沒有影響。它也不影響PHP的用戶空間輸出緩衝機制。這意味着如果使用這些緩衝區,則必須調用ob_flush()和flush()來刷新ob輸出緩衝區。
幾臺服務器,尤其是Win32上的服務器,仍然會緩存腳本的輸出,直到將結果傳輸到瀏覽器之前終止。
像Apache等mod_gzip服務器模塊可能會做自己的緩衝,這將導致flush()不會導致數據立即發送到客戶端。
換句話說:測試,測試,測試。確保Web服務器不干擾您嘗試實現的行爲。必要時重新配置Web服務器。
很好的答案,謝謝! –