3 回答

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超3個(gè)贊
做兩件事:
禁用用戶空間輸出緩沖區(qū),或者...
在全球范圍內(nèi),通過(guò)...
output_buffering在您的php.ini中關(guān)閉,或
output_buffering使用以下命令在Apache配置中關(guān)閉
php_flag "output_buffering" Off
或僅針對(duì)您關(guān)心的腳本,通過(guò)以下任一方式...
致電ob_end_flush(),或
呼喚 ob_end_clean()
另外,通過(guò)以下任一方法,盡可能禁用服務(wù)器級(jí)別的輸出緩沖區(qū):
ob_implicit_flush()在腳本的開(kāi)頭調(diào)用,或者
flush()在每個(gè)echo將輸出添加到響應(yīng)主體的語(yǔ)句或其他語(yǔ)句之后調(diào)用
較長(zhǎng)的版本
令人困惑的是,可能存在兩個(gè)相關(guān)的緩沖層,PHP文檔在區(qū)分這兩個(gè)方面做得很差。
輸出緩沖區(qū)
PHP文檔通常將第一層稱為“輸出緩沖區(qū)”。此緩沖層僅影響到HTTP響應(yīng)正文的輸出,而不影響標(biāo)頭。您可以使用打開(kāi)緩沖輸出ob_start(),ob_end_flush()或者使用或?qū)⑵潢P(guān)閉ob_end_clean()。您還可以使用output_bufferingphp.ini中的選項(xiàng)使所有腳本自動(dòng)從輸出緩沖開(kāi)始。
對(duì)于生產(chǎn)版本的php.ini,此選項(xiàng)的默認(rèn)值為4096,這意味著將在輸出緩沖區(qū)中緩沖輸出的前4096個(gè)字節(jié),這時(shí)將對(duì)其進(jìn)行刷新并關(guān)閉輸出緩沖。
您可以通過(guò)在php.ini文件中將設(shè)置output_buffering為Off(或使用
php_flag "output_buffering" Off
如果您使用的是Apache,請(qǐng)?jiān)贏pache配置中使用?;蛘?,您可以通過(guò)調(diào)用ob_end_clean()或ob_end_flush()在腳本的開(kāi)頭禁用單個(gè)腳本的功能。
寫緩沖區(qū)和Web服務(wù)器緩沖區(qū)
PHP手冊(cè)將輸出緩沖區(qū)之外的內(nèi)容稱為“寫緩沖區(qū)”,以及Web服務(wù)器具有的任何緩沖系統(tǒng)。如果您通過(guò)mod_php和結(jié)合使用PHP和Apache ,而沒(méi)有使用mod_gzip,則可以調(diào)用flush()來(lái)刷新它們;否則,您可以調(diào)用。與其他后端一樣,它也可能會(huì)起作用,盡管該手冊(cè)對(duì)提供保證不屑一顧:
描述
void flush ( void )
刷新PHP的寫緩沖區(qū)以及PHP使用的任何后端PHP(CGI,Web服務(wù)器等)。這會(huì)嘗試將當(dāng)前輸出一直推送到瀏覽器,但有一些警告。
flush()可能無(wú)法覆蓋Web服務(wù)器的緩沖方案,并且對(duì)瀏覽器中的任何客戶端緩沖都沒(méi)有影響。它也不會(huì)影響PHP的用戶空間輸出緩沖機(jī)制。這意味著,如果您正在使用ob_flush()和flush()來(lái)刷新ob輸出緩沖區(qū),則必須同時(shí)調(diào)用它們。
還有兩種方法可以使PHP flush()每次您進(jìn)行echo任何操作(或執(zhí)行將輸出回顯到響應(yīng)正文的任何其他操作)時(shí)自動(dòng)調(diào)用。
首先是打電話ob_implicit_flush()。請(qǐng)注意,該函數(shù)被欺騙性命名。鑒于其ob_前綴,任何理智的人會(huì)認(rèn)為它會(huì)影響到“輸出緩沖”,因?yàn)檫@樣做ob_start,ob_flush但是,這種情況并非如此; ob_implicit_flush()像一樣flush(),會(huì)影響服務(wù)器級(jí)別的輸出緩沖區(qū),并且不會(huì)與其他ob_功能控制的輸出緩沖區(qū)發(fā)生任何交互。
第二種是通過(guò)在php.ini 中將implicit_flush標(biāo)志設(shè)置為來(lái)全局啟用隱式刷新On。這等效于ob_implicit_flush()在每個(gè)腳本的開(kāi)頭進(jìn)行調(diào)用。請(qǐng)注意,本手冊(cè)以“嚴(yán)重的性能隱含性”為例,對(duì)此建議不多,我在與切向相關(guān)的答案中對(duì)此進(jìn)行了探討。

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超6個(gè)贊
除了禁用輸出緩沖外,您還可以flush()在每次讀取操作之后進(jìn)行調(diào)用。這避免了麻煩服務(wù)器配置,并使腳本更具可移植性。

TA貢獻(xiàn)2011條經(jīng)驗(yàn) 獲得超2個(gè)贊
輸出緩沖可以分層,在某些情況下,較早的代碼已達(dá)到多個(gè)級(jí)別。這將清除所有內(nèi)容。
while (ob_get_level()) ob_end_clean();
// or ob_end_flush() if you want the contents of the buffer.
- 3 回答
- 0 關(guān)注
- 1107 瀏覽
添加回答
舉報(bào)