PHP中output buffering的原理及應用

php緩存過程

在請求一個PHP的過程當中,實際上通過三個緩存:php

  1. 程序緩存html

  2. ob緩存apache

  3. 瀏覽器緩存.瀏覽器

開啓ob的兩個方法

1.在php.ini 配置 ;output_buffering = 4096 這裏去掉;號便可
2 在php頁面中使用 ob_start();

經過php.ini 打開的,則做用於全部的php頁面 。使用ob_start()打開則只做用於該頁面緩存

ob緩存的知識點

  • 在服務中,若是咱們開啓了ob緩存,則echo數據首先放入到ob中函數

  • 當PHP頁面執行到最後,則會把ob緩存的數據(若是有的話), 強制刷新到程序緩存,而後經過apache對數據封裝成http響應包,返 回給瀏覽器spa

  • 若是沒有ob,全部的數據直接放入程序緩存。 header信息無論你是否開啓ob,老是放入到程序緩存。code

ob相關的函數

ob_start($callback)

//在當前頁面中開啓ob,注意callback
ob_start($callback);

ob_get_contents()

//獲取當前ob緩存中的內容
ob_get_contents()

ob_get_clean()

//獲取當前ob緩存中的內容,而且清空當前的ob緩存
ob_get_clean()

ob_flush()

//將ob緩存中的內容,刷到程序緩存中,但並無關閉ob緩存
ob_flush()

ob_end_flush()

//關閉ob緩存,並將數據刷回到程序緩存中
ob_end_flush()

ob_clean()

//將ob緩存中的內容清空
ob_clean()

ob_end_clean()

//將ob緩存中的數據清空,而且關閉ob緩存
ob_end_clean()

注意ob_start($callback)的回調

<?php
ob_start("callback_func");
function callback_func($str){
    return "callback".$str;
}
echo "123";//輸出:callback123

應用場景

在header()發送以前的報錯

出錯代碼
<?php
echo "before_header";
header("Content-type:text/html;charset=utf-8");
echo "after_header";

輸出:orm

Warning: Cannot modify header information - headers already sent by (output started at /Users/shuchao/Desktop/test.php:2) in /Users/shuchao/Desktop/test.php on line 3
解決辦法

在發送header前開啓ob,則全部的echo內容都會到ob裏面,從而解決錯誤。htm

<?php
ob_start();
echo "before_header\n";
header("Content-type:text/html;charset=utf-8");
echo "after_header\n";

輸出

before_header
after_header

更多精彩,請關注公衆號「聊聊代碼」,讓咱們一塊兒聊聊「左手代碼右手詩」的事兒。
圖片描述

相關文章
相關標籤/搜索