php邊執行邊輸出資料整理

2021-07-10 19:39:40 字數 2415 閱讀 1415

//ignore_user_abort(true);//是否忽略瀏覽器的斷開而繼續執行指令碼

header( 'content-type: text/html;charset=utf-8' );

echo str_pad("",1000); //輸出1000個空格(瀏覽器需要接受一定長度的資料之後才會輸出內容)

echo 'begin...

';ob_flush();

flush();

for($i=0;$i<10;$i++)

ob_flush();

flush();

sleep(1);//睡眠一秒}

echo 'ok';

/*

首先明確一下php的輸出順序

1.開啟了php輸出快取: echo,print -> php output_buffring -> server buffering -> browser buffering -> browser display

2.未開啟php輸出快取: echo,print -> server buffering -> browser buffering -> browser display

另外明確一下瀏覽器的輸出快取:ie為256bytes, chrome與firefox為1000bytes,只有輸出資料達到了這個長度或者指令碼結束瀏覽器才會將資料輸出在頁面上

再來說說用到的幾個php設定和api:

1.php.ini中的output_buffering配置

•off: 表示關閉php輸出快取

•on: 開啟無限大的輸出快取

•4096: 開啟大小為4096byte的輸出快取

2.php.ini中的implicit_flush配置

•on: 表示每次輸出(如echo,print)後自動呼叫flush()函式後,直接輸出

•off: 與on相反,每次輸出後不會呼叫flush(),需要等到server buffering滿了才會輸出,但是我們可以用flush()函式代替它,不開啟也沒關係,反而更加靈活

3.ob_flush()函式: 取出php buffering中的資料,放入server buffering

4.flush()函式: 取出server buffering的資料,放入browser buffering

5.ob_start()函式:在伺服器開啟乙個緩衝區來儲存所有的輸出。所以在任何時候使用echo ,輸出都將被加入緩衝區中,直到程式執行結束或者使用ob_flush()來結束。然後在伺服器中緩衝區的內容才會傳送到瀏覽器,由瀏覽器來解析顯示

ob_*系列函式, 是操作php本身的輸出緩衝區.

ob_get_contents() - 返回輸出緩衝區的內容

ob_flush() - 沖刷出(送出)輸出緩衝區中的內容

ob_clean() - 清空(擦掉)輸出緩衝區

ob_end_flush() - 沖刷出(送出)輸出緩衝區內容並關閉緩衝

ob_end_clean() - 清空(擦除)緩衝區並關閉輸出緩衝

flush() - 重新整理輸出緩衝 

總結:ob_flush是重新整理php自身的緩衝區.

函式ob_end_clean 會清除緩衝區的內容,並將緩衝區關閉,但不會輸出內容。

此時得用乙個函式ob_get_contents()在ob_end_clean()前面來獲得緩衝區的內容。

這樣的話, 能將在執行ob_end_clean()前把內容儲存到乙個變數中,然後在ob_end_clean()後面對這個變數做操作

可以被用作快取靜態html內容

注意:flush, 嚴格來講, 這個只有在php做為apache的module(handler或者filter)安裝的時候, 才有實際作用. 它是重新整理webserver(可以認為特指apache)的緩衝區.

1.在apache module的sapi下, flush會通過呼叫sapi_module的flush成員函式指標, 間接的呼叫apache的api: ap_rflush重新整理apache的輸出緩衝區,

當然手冊中也說了, 有一些apache的其他模組, 可能會改變這個動作的結果..

2.有些apache的模組,比如mod_gzip,可能自己進行輸出快取,這將導致flush()函式產生的結果不會立即被傳送到客戶端瀏覽器。

甚至瀏覽器也會在顯示之前,快取接收到的內容。例如 netscape瀏覽器會在接受到換行或 html 標記的開頭之前快取內容,並且在接受到 標記之前,不會顯示出整個**。

3.一些版本的 microsoft internet explorer 只有當接受到的256個位元組以後才開始顯示該頁面,所以必須傳送一些額外的空格來讓這些瀏覽器顯示頁面內容。

所以, 正確使用倆者的順序是. 先ob_flush, 然後flush。

當然, 在其他sapi下, 不呼叫flush也可以, 只不過為了保證你**的可移植性, 建議配套使用.*/

感謝大家的無私分享!

linux語句整理 邊整理邊記錄

路徑 etc sysconfig network scripts ifcfg eth0 命令 service network restart 命令 shutdown h now 命令格式為 date s 時間字串 例如只修改系統的日期,不修改時間 時分秒 date s 2012 08 02 或只修改...

docker 容器執行ubuntu 邊學邊發部落格

docker近來非常非常火熱。docker是一種容器,和虛擬機器 不同,但也可以看成輕量級的虛擬機器,啟動更快,更省記憶體。對比虛擬機器與docker 下一段摘自 docker守護程序可以直接與主作業系統進行通訊,為各個docker容器分配資源 它還可以將容器與主作業系統隔離,並將各個容器互相隔離。...

php 命名空間通俗易懂 邊練邊學PHP(二)

1.php 的開始標記 php 以結束 這主要是因為php在建立之初是為了方便寫網頁,所以大部分 是嵌入到html頁面裡面的,php檔案允許包含除了php 外的其他內容。為了區別html 和php php檔案裡面php 會包含在之間,標記之外的內容會原樣輸出。注意 a.早期的 也有使用和?標記的。b...