關於PHP 刷新緩沖區操作(邊執行邊輸出)簡單分析


背景:估計那個同學想做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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM