背景:估計那個同學想做PHP的長連接,或者是想有些較為少用的用法,但它涉及到了緩沖的概念(PHP和Apache,PHP和Nginx等,Web服務器的一個接口等)
關於PHP 刷新緩沖區操作(邊執行邊輸出)簡單分析:
PHP群里有一位同學問
<?php ob_start(); echo 'Begin ...<br />'; for( $i = 0 ; $i < 10 ; $i++ ) { echo $i . '<br />'; flush(); ob_flush(); sleep(1); } echo 'End ...<br />'; exit; ?>
這段代碼在apache下能邊執行邊輸出,在nginx下怎么就不行了?
簡單的理解為2個問題:
1 首先這個問題核心就是當緩沖區數據達到一定量時先輸出到瀏覽器。
2 apache和nginx 的php執行方式差異。
這個問題和我上篇博文《FastCGI 技術介紹》有一定的聯系,apache是以CGI/CLI的方式調用php。而nginx 是以fastcgi方式調用PHP。FastCGI 基於Unix domain socket或者tcp/ip進行通信。
步驟 名稱 描述
1 FCGI_PARAMS 從web服務器如nginx向fastcgi應用程序發送請求數據、環境變量等
2 FCGI_STDIN 接送從web服務器發送來的數據
3 FCGI_DATA 過濾web服務器發送來的數據
4 FCGI_STDOUT 發送數據到web服務器
5 FCGI_STDERR 發送狀態(錯誤信息)到web服務器
6 FCGI_END_REQUEST 結束本次http請求
就是意味着可以設置一定的緩沖區大小 來實現。
土話就是:人為讓緩沖區容量達到一定額。
nginx FastCGI 提供了2個參數
修改nginx.conf
location ~ \.php$ { … fastcgi_buffer_size 2k;//緩沖區大小 fastcgi_buffers 256 2k; //開辟256個 2k大小的緩沖區 }
參數可以調整。具體文檔:http://wiki.nginx.org/HttpFastcgiModule#fastcgi_buffer_size
修改上述PHP代碼
<?php echo 'Begin ...<br />'; for ($i = 0; $i < 10; $i++) { echo $i . '<br />'; echo str_repeat(" ", 1024 * 2);//人為將緩沖數據擴充到2k flush(); ob_flush(); sleep(1); } echo 'End ...<br />'; exit; ?>
來自:http://www.cydphp.cn/?p=155
再就是這位兄弟的:http://www.cydphp.cn/?p=107 【寫得比較原始,原始的CGI,當年沒有PHP時是這么干的,可以有較為深入的理解】
轉:http://www.justwinit.cn/post/6182/