我在一次調(diào)試PHP逐行輸出時(shí)候,發(fā)現(xiàn)ob_flush和flush兩個(gè)都失效了,通過(guò)phpinfo基本能判斷php.ini的設(shè)置是正常的。
IIS中flush失效的解決方法:
您必須將所需處理程序的ResponseBufferLimit值設(shè)置為足夠低的數(shù)字,以使其實(shí)際刷新.我建議使用0,因?yàn)樗柚笽IS除了傳遞PHP腳本發(fā)送的內(nèi)容之外,什么都不做. 您可以使用以下命令行將php處理程序的ResponseBufferLimit設(shè)置為0
appcmd.exe set config /section:handlers "/[name='NAME'].ResponseBufferLimit:0"
或者,您可以直接編輯applicationHost.config并在XML元素中添加ResponseBufferLimit屬性
打開(kāi)文件 C:\Windows\System32\inetsrv\config\applicationHost.config ,注意如果你的是64位系統(tǒng),這個(gè)文件就必須用64位的編輯軟件打開(kāi),32位的軟件打開(kāi)會(huì)提示文件不存在,就用系統(tǒng)自帶的notepad記事本打開(kāi)就可以了。找到下面這一段,加入紅色的那段代碼就行了,也就是php這個(gè)handler里面加上responseBufferLimit="0"。
或者網(wǎng)站目錄下有一個(gè)web.config,如下:
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.webServer> <handlers> <remove name="ZZphpserver_phpFastCGI" /> <add name="ZZphpserver_phpFastCGI" path="*.php" verb="*" modules="FastCgiModule" scriptProcessor="D:\ZZphpserver\php7.3\php-cgi.exe" responseBufferLimit="0"/> </handlers> </system.webServer> </configuration>
Nginx中flush失效的解決方法:
發(fā)現(xiàn)Nginx中,有如下的設(shè)置:
fastcgi_buffer_size 128k; fastcgi_buffers 8 128k;
問(wèn)題基本找到了,Nginx會(huì)緩沖PHP輸出的信息,當(dāng)達(dá)到128k時(shí)才會(huì)將緩沖區(qū)的數(shù)據(jù)發(fā)送給客戶端,那么我們首先需要將這個(gè)緩沖區(qū)調(diào)小,比如:
fastcgi_buffer_size 4k; fastcgi_buffers 8 4k;
并且,必須禁用gzip
gzip off;
然后,在php中,在ob_flush和flush前,輸出一段達(dá)到4k的內(nèi)容,例如:
echo str_repeat(‘ ‘, 1024*4);
到此,PHP就可以正常通過(guò)ob_flush和flush逐行輸出需要的內(nèi)容了。
測(cè)試代碼:
<?php echo str_repeat(' ' ,4096); for($i=0;$i<10;$i++) { echo $i; ob_flush(); flush(); sleep(1); } ?>
如對(duì)本文有疑問(wèn),請(qǐng)?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會(huì)為你解答??! 點(diǎn)擊進(jìn)入論壇