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