国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【modernPHP專題(10)】理解output buffer

kelvinlee / 489人閱讀

摘要:磁盤高速緩存操作系統(tǒng)中使用磁盤高速緩存技術來提高磁盤的速度,對高速緩存復制的訪問要比原始數(shù)據(jù)訪問更為高效。因此,磁盤高速緩存在邏輯上屬于磁盤,物理上則是駐留在內(nèi)存中的盤塊。

1. 磁盤高速緩存(Disk Cache)

操作系統(tǒng)中使用磁盤高速緩存技術來提高磁盤的I/O速度,對高速緩存復制的訪問要比原始數(shù)據(jù)訪問更為高效。例如,正在運行的進程的指令既存儲在磁盤上,也存儲在物理內(nèi)存上,也被復制到CPU的二級和一級高速緩存中。

不過,磁盤高速緩存技術不同于通常意義下的介于CPU與內(nèi)存之間的小容量高速存儲器,而是 指利用內(nèi)存中的存儲空間來暫存從磁盤中讀出的一系列盤塊中的信息。因此,磁盤高速緩存在邏輯上屬于磁盤,物理上則是駐留在內(nèi)存中的盤塊。

高速緩存在內(nèi)存中分為兩種形式:一種是在內(nèi)存中開辟一個多帶帶的存儲空間作為磁速緩存,大小固定;另一種是把未利用的內(nèi)存空間作為一個緩沖池,供請求分頁系統(tǒng)和磁盤I/O時共享。

2. 緩沖區(qū)(Buffer)

高速設備(如CPU)和低速設備(如磁盤)的通信都要經(jīng)過緩存區(qū),高速設備永遠不會直接去訪問低速設備。所以緩沖區(qū)是計算機中暫時存放輸出或輸入信息的內(nèi)存區(qū)域。緩和高速部件和低速部件之間通信速度不匹配的矛盾。

3. PHP輸出緩沖區(qū)

輸出緩沖區(qū)顧名思義是輸出信息暫時存放的內(nèi)存區(qū)域,通過ob_*系列函數(shù)來控制輸出緩沖區(qū)。

當php腳本執(zhí)行結(jié)束(會自動調(diào)用ob_flush())或強制刷新(手動調(diào)用ob_fush())緩沖區(qū)后,才會把數(shù)據(jù)發(fā)送給Nginx fastcgi客戶端。當然PHP還有其他的緩沖區(qū),比如字符串緩沖區(qū)finfo::buffer。

PHP的輸出緩沖區(qū)默認是開啟,并且大小是4096字節(jié)。開啟后對所有php頁面都生效。

另外一種在頁面中多帶帶開啟緩沖區(qū)的辦法是ob_start()函數(shù)。

// ob_start()有三個參數(shù),$chunk_size是用來設置緩沖區(qū)大小,可以設置0-4096,默認是0表示大小不限。
bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )

注意:一個ob_start()就是一個新的緩沖區(qū),緩沖區(qū)是互相疊加的

4. Nginx緩沖區(qū)

Nginx默認不會實時把php-fpm響應的數(shù)據(jù)返回給客戶端,而是暫存在Nginx緩沖區(qū)中。當php腳本執(zhí)行結(jié)束(自動調(diào)用flush())或強制刷新(手動flush())緩沖區(qū)后,才會把數(shù)據(jù)發(fā)送給客戶端。

5. 瀏覽器緩沖區(qū)

瀏覽器默認不會實時顯示從Nginx返回的數(shù)據(jù),而是把接受到的數(shù)據(jù)暫存在瀏覽器緩沖區(qū)中,當緩沖區(qū)滿后,才會開始顯示。不同的瀏覽器緩沖區(qū)大小不同。實際測試發(fā)現(xiàn)Mac 下chrome和safari都需要輸出1024字節(jié)。沒有找到刷新緩沖區(qū)的辦法,可以通過發(fā)送額外的空格來解決。

或者通過curl來請求,通過–no-buffer來禁用curl buffer。

curl "niliu.me" --no_buffer
實例篇 實時輸出
// ob_get_level() 返回多少個緩沖區(qū)(因為緩沖區(qū)是疊加的,也可以稱之為多級緩沖區(qū))
var_dump(ob_get_level()); // out: 1, 一級緩沖區(qū)
if (ob_get_level() == 0) {
    // 如果沒緩沖區(qū),就開啟新的PHP緩沖區(qū)
    // 默認會有一塊緩沖區(qū),默認的緩沖區(qū)其實是很小的,所以不用什么str_pad撐滿
    ob_start();
}
for ($i = 0;$i < 10;$i ++) {
    echo "Line to show.";
    // nginx fastcgi緩沖區(qū)大小是4K,需要發(fā)送額外4K空格;
    //  echo str_pad("",4096)."
";

    // php緩存刷入Apache/nginx
    ob_flush();

    // 從Apache/nginx刷到瀏覽器
    flush();
    //此時,瀏覽器應該顯示了, 如果瀏覽器不是即時顯示,就輸空格撐滿瀏覽器buffer
    // echo str_repeat(" ",1024);

    sleep(2);
}
echo "Done.";
ob_end_flush();  // 沖刷出(送出)輸出緩沖區(qū)內(nèi)容并關閉緩沖
var_dump(ob_get_level()); // out: 0, 無緩沖區(qū)
模板渲染
class Template{
    /**
     * 渲染方法
     *
     * @access public
     * @param obj 信息類
     * @param string 模板文件名
     */
    public function render($context, $tpl){
        $closure = function($tpl){
            ob_start();
            include $tpl;
            return ob_end_flush();
        };
         
        // PHP7: $closure->call($context, $tpl);
        $closure = $closure->bindTo($context, $context);
        $closure($tpl);
    }
}
靜態(tài)頁生成
// 開啟緩沖區(qū)
ob_start();

// 業(yè)務邏輯省略
// .....

$this->assign("模板中的變量分配");
$tpl->display("default_1.tpl");

// 獲取緩沖區(qū)中解析變量后的模板
$html = ob_get_contents();
// 清空并關閉緩沖區(qū)
ob_end_clean();

// 把html寫入文件
// 業(yè)務邏輯省略 ...

文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/31455.html

相關文章

  • modernPHP專題(8)】匿名函數(shù)和閉包

    摘要:匿名函數(shù)輸出可以直接將匿名函數(shù)進行傳遞。報錯,找不到變量之所以稱為副本,是因為通過閉包傳值到匿名函數(shù)內(nèi)的變量值也是不能改變。該方法使用了一個作為回調(diào)函數(shù)。 匿名函數(shù) // Example1 $func = function( $param ) { echo $param; }; $func( some string );//輸出:some string // Example2...

    junnplus 評論0 收藏0
  • modernPHP專題(13)】ZendOpcache字節(jié)碼緩存

    摘要:概述字節(jié)碼緩存不是的新特性,有很多獨立的擴展可以實現(xiàn),比如和等,但是截至目前這些擴展都沒有集成到內(nèi)核,從開始,內(nèi)置了字節(jié)碼緩存功能,名為。開始之前,我們先來看看什么是字節(jié)碼緩存,以及字節(jié)碼緩存的作用是什么。該函數(shù)將重置整個字節(jié)碼緩存。 概述 字節(jié)碼緩存不是PHP的新特性,有很多獨立的擴展可以實現(xiàn),比如APC、eAccelerator和Xache等,但是截至目前這些擴展都沒有集成到PHP...

    KevinYan 評論0 收藏0
  • modernPHP專題(3)】依賴注入與服務容器

    摘要:而依賴倒置原則的思想是,上層不應該依賴下層,應依賴接口。上面通過構(gòu)造函數(shù)注入對象的方式,就是最簡單的依賴注入當然注入不僅可以通過構(gòu)造函數(shù)注入,也可以通過屬性注入,上面你可以通過一個來動態(tài)為這個屬性賦值。 依賴倒置和控制反轉(zhuǎn)是一種編程思想,而依賴注入就是通過服務容器實現(xiàn)這種面向接口或者是面向抽象編程的思想 概念理解 依賴倒置原則 依賴倒置是一種軟件設計思想,在傳統(tǒng)軟件中,上層代碼依賴于下...

    terro 評論0 收藏0
  • modernPHP專題(7)】生成器語法

    摘要:通過生成器來生成關聯(lián)數(shù)組下面每一行是用分號分割的字段組合,第一個字段將被用作鍵名。正常來說,產(chǎn)生的是一個,它的成員變量與函數(shù)不存在別名引用關系。關鍵字在的版本,生成器允許從其他生成器,可迭代對象或數(shù)組通過關鍵字來生成對應的值輸出 一般你在迭代一組數(shù)據(jù)的時候,需要創(chuàng)建一個數(shù)據(jù),假設數(shù)組很大,則會消耗很大性能,甚至造成內(nèi)存不足。 //Fatal error: Allowed memory ...

    jackwang 評論0 收藏0
  • modernPHP專題(9)】匿名類

    摘要:復制當前閉包對象,綁定指定的對象和類作用域。類作用域,可以是對象,也可以是實例名稱什么是匿名類先理解以下三個例子例閉包函數(shù)都是繼承類返回匿名函數(shù)返回匿名函數(shù),也就是閉包函數(shù),所有閉包函數(shù)都是繼承類輸出例將一個匿名函數(shù)綁定到一個類中。 類結(jié)構(gòu) Closure { /* 方法 */ // 用于禁止實例化的構(gòu)造函數(shù) __construct ( void ) ...

    ninefive 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<