摘要:磁盤高速緩存操作系統(tǒng)中使用磁盤高速緩存技術(shù)來提高磁盤的速度,對高速緩存復(fù)制的訪問要比原始數(shù)據(jù)訪問更為高效。因此,磁盤高速緩存在邏輯上屬于磁盤,物理上則是駐留在內(nèi)存中的盤塊。
1. 磁盤高速緩存(Disk Cache)
操作系統(tǒng)中使用磁盤高速緩存技術(shù)來提高磁盤的I/O速度,對高速緩存復(fù)制的訪問要比原始數(shù)據(jù)訪問更為高效。例如,正在運(yùn)行的進(jìn)程的指令既存儲在磁盤上,也存儲在物理內(nèi)存上,也被復(fù)制到CPU的二級和一級高速緩存中。
不過,磁盤高速緩存技術(shù)不同于通常意義下的介于CPU與內(nèi)存之間的小容量高速存儲器,而是 指利用內(nèi)存中的存儲空間來暫存從磁盤中讀出的一系列盤塊中的信息。因此,磁盤高速緩存在邏輯上屬于磁盤,物理上則是駐留在內(nèi)存中的盤塊。
高速緩存在內(nèi)存中分為兩種形式:一種是在內(nèi)存中開辟一個多帶帶的存儲空間作為磁速緩存,大小固定;另一種是把未利用的內(nèi)存空間作為一個緩沖池,供請求分頁系統(tǒng)和磁盤I/O時共享。
2. 緩沖區(qū)(Buffer)高速設(shè)備(如CPU)和低速設(shè)備(如磁盤)的通信都要經(jīng)過緩存區(qū),高速設(shè)備永遠(yuǎn)不會直接去訪問低速設(shè)備。所以緩沖區(qū)是計(jì)算機(jī)中暫時存放輸出或輸入信息的內(nèi)存區(qū)域。緩和高速部件和低速部件之間通信速度不匹配的矛盾。
3. PHP輸出緩沖區(qū)輸出緩沖區(qū)顧名思義是輸出信息暫時存放的內(nèi)存區(qū)域,通過ob_*系列函數(shù)來控制輸出緩沖區(qū)。
當(dāng)php腳本執(zhí)行結(jié)束(會自動調(diào)用ob_flush())或強(qiáng)制刷新(手動調(diào)用ob_fush())緩沖區(qū)后,才會把數(shù)據(jù)發(fā)送給Nginx fastcgi客戶端。當(dāng)然PHP還有其他的緩沖區(qū),比如字符串緩沖區(qū)finfo::buffer。
PHP的輸出緩沖區(qū)默認(rèn)是開啟,并且大小是4096字節(jié)。開啟后對所有php頁面都生效。
另外一種在頁面中多帶帶開啟緩沖區(qū)的辦法是ob_start()函數(shù)。
// ob_start()有三個參數(shù),$chunk_size是用來設(shè)置緩沖區(qū)大小,可以設(shè)置0-4096,默認(rèn)是0表示大小不限。 bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )
注意:一個ob_start()就是一個新的緩沖區(qū),緩沖區(qū)是互相疊加的
4. Nginx緩沖區(qū)Nginx默認(rèn)不會實(shí)時把php-fpm響應(yīng)的數(shù)據(jù)返回給客戶端,而是暫存在Nginx緩沖區(qū)中。當(dāng)php腳本執(zhí)行結(jié)束(自動調(diào)用flush())或強(qiáng)制刷新(手動flush())緩沖區(qū)后,才會把數(shù)據(jù)發(fā)送給客戶端。
5. 瀏覽器緩沖區(qū)瀏覽器默認(rèn)不會實(shí)時顯示從Nginx返回的數(shù)據(jù),而是把接受到的數(shù)據(jù)暫存在瀏覽器緩沖區(qū)中,當(dāng)緩沖區(qū)滿后,才會開始顯示。不同的瀏覽器緩沖區(qū)大小不同。實(shí)際測試發(fā)現(xiàn)Mac 下chrome和safari都需要輸出1024字節(jié)。沒有找到刷新緩沖區(qū)的辦法,可以通過發(fā)送額外的空格來解決。
或者通過curl來請求,通過–no-buffer來禁用curl buffer。
curl "niliu.me" --no_buffer實(shí)例篇 實(shí)時輸出
// ob_get_level() 返回多少個緩沖區(qū)(因?yàn)榫彌_區(qū)是疊加的,也可以稱之為多級緩沖區(qū)) var_dump(ob_get_level()); // out: 1, 一級緩沖區(qū) if (ob_get_level() == 0) { // 如果沒緩沖區(qū),就開啟新的PHP緩沖區(qū) // 默認(rèn)會有一塊緩沖區(qū),默認(rèn)的緩沖區(qū)其實(shí)是很小的,所以不用什么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(); //此時,瀏覽器應(yīng)該顯示了, 如果瀏覽器不是即時顯示,就輸空格撐滿瀏覽器buffer // echo str_repeat(" ",1024); sleep(2); } echo "Done."; ob_end_flush(); // 沖刷出(送出)輸出緩沖區(qū)內(nèi)容并關(guān)閉緩沖 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è)務(wù)邏輯省略 // ..... $this->assign("模板中的變量分配"); $tpl->display("default_1.tpl"); // 獲取緩沖區(qū)中解析變量后的模板 $html = ob_get_contents(); // 清空并關(guān)閉緩沖區(qū) ob_end_clean(); // 把html寫入文件 // 業(yè)務(wù)邏輯省略 ...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/31455.html
摘要:匿名函數(shù)輸出可以直接將匿名函數(shù)進(jìn)行傳遞。報錯,找不到變量之所以稱為副本,是因?yàn)橥ㄟ^閉包傳值到匿名函數(shù)內(nèi)的變量值也是不能改變。該方法使用了一個作為回調(diào)函數(shù)。 匿名函數(shù) // Example1 $func = function( $param ) { echo $param; }; $func( some string );//輸出:some string // Example2...
摘要:概述字節(jié)碼緩存不是的新特性,有很多獨(dú)立的擴(kuò)展可以實(shí)現(xiàn),比如和等,但是截至目前這些擴(kuò)展都沒有集成到內(nèi)核,從開始,內(nèi)置了字節(jié)碼緩存功能,名為。開始之前,我們先來看看什么是字節(jié)碼緩存,以及字節(jié)碼緩存的作用是什么。該函數(shù)將重置整個字節(jié)碼緩存。 概述 字節(jié)碼緩存不是PHP的新特性,有很多獨(dú)立的擴(kuò)展可以實(shí)現(xiàn),比如APC、eAccelerator和Xache等,但是截至目前這些擴(kuò)展都沒有集成到PHP...
摘要:而依賴倒置原則的思想是,上層不應(yīng)該依賴下層,應(yīng)依賴接口。上面通過構(gòu)造函數(shù)注入對象的方式,就是最簡單的依賴注入當(dāng)然注入不僅可以通過構(gòu)造函數(shù)注入,也可以通過屬性注入,上面你可以通過一個來動態(tài)為這個屬性賦值。 依賴倒置和控制反轉(zhuǎn)是一種編程思想,而依賴注入就是通過服務(wù)容器實(shí)現(xiàn)這種面向接口或者是面向抽象編程的思想 概念理解 依賴倒置原則 依賴倒置是一種軟件設(shè)計(jì)思想,在傳統(tǒng)軟件中,上層代碼依賴于下...
摘要:通過生成器來生成關(guān)聯(lián)數(shù)組下面每一行是用分號分割的字段組合,第一個字段將被用作鍵名。正常來說,產(chǎn)生的是一個,它的成員變量與函數(shù)不存在別名引用關(guān)系。關(guān)鍵字在的版本,生成器允許從其他生成器,可迭代對象或數(shù)組通過關(guān)鍵字來生成對應(yīng)的值輸出 一般你在迭代一組數(shù)據(jù)的時候,需要創(chuàng)建一個數(shù)據(jù),假設(shè)數(shù)組很大,則會消耗很大性能,甚至造成內(nèi)存不足。 //Fatal error: Allowed memory ...
摘要:復(fù)制當(dāng)前閉包對象,綁定指定的對象和類作用域。類作用域,可以是對象,也可以是實(shí)例名稱什么是匿名類先理解以下三個例子例閉包函數(shù)都是繼承類返回匿名函數(shù)返回匿名函數(shù),也就是閉包函數(shù),所有閉包函數(shù)都是繼承類輸出例將一個匿名函數(shù)綁定到一個類中。 類結(jié)構(gòu) Closure { /* 方法 */ // 用于禁止實(shí)例化的構(gòu)造函數(shù) __construct ( void ) ...
閱讀 991·2021-09-07 09:58
閱讀 1559·2021-09-07 09:58
閱讀 2942·2021-09-04 16:40
閱讀 2552·2019-08-30 15:55
閱讀 2486·2019-08-30 15:54
閱讀 1415·2019-08-30 15:52
閱讀 483·2019-08-30 10:49
閱讀 2651·2019-08-29 13:21