1. 程式人生 > >php中ob_start()系列函式的使用

php中ob_start()系列函式的使用

    我在看《php設計模式》的時候看到一個有趣的函式ob_start(),查了一下網友的部落格,滿心歡喜,我們在平時做模版快取會選擇Smart,實際上我們可以自己來,不借助其他工具,對於我這樣對程式碼控制慾強的人來說簡直好東西。輸出控制函式可以幫助我們自由的控制php指令碼資料的輸出,對echo()這類函式起作用,但對header()等函式無效。所以我們利用這一點可以在header()函式之前進行輸出,實際上一開始僅僅是輸出到緩衝去並沒有真正的輸出,所以和header()之前輸出會報錯的說法並不矛盾。下面我們來看例子

    1.簡單程式碼段

    我建立了一個test.php  

<?php
ob_start();//開啟緩衝區輸出
echo 'Hello';//
header('location:index.php');瀏覽器被重定向到index.php
ob_end_flush();//輸出全部內容到瀏覽器
    另外一個檔案inde.php   
<?php
echo '看看在之前還是之後輸出';
    我原本以為會從test.php的內容輸出到index.php,但是並不會跨域輸出,依然僅僅是輸出到當前介面。這裡最值得注意的是通常情況下header()之前有輸出會報錯,但這裡並沒有,所以我們平常的說法要改一改了header()輸出到瀏覽器頁面會報錯,這樣說才對。

    2.相關函式介紹

     1)FLUSH():重新整理緩衝區的內容,輸出。

        函式格式:flush()

        說明:這個函式經常使用,效率高。

     2)ob_start():開啟緩衝區

        函式格式:void ob_start();

        說明:他的作用就是開啟緩衝區,所有非標頭檔案的輸出都會到緩衝區,作用就類似於我們使用GD庫的時候建立的畫布,可以使用ob_get_flush()或flush()輸出緩衝區內容。

     3)ob_get_contents()返回緩衝區內的內容

        函式格式:string ob_get_contents()

        說明:如果沒有啟用緩衝區,將會返回FALSE

     4)ob_get_length():返回內部緩衝區的長度

        函式格式:init ob_get_length()

        說明:緩衝區沒有啟用將會返回FALSE

     5)ob_end_flush():輸出緩衝區內容,關閉緩衝區

        函式格式:void ob_end_flush()

     6)ob_end_clean():刪除緩衝區內容並關閉

        函式格式:void ob_end_clean()

        說明:注意這裡並不會輸出,而是起到型別銷燬資源控制代碼一樣的作用

     7)ob_implicit_flush:開啟或關閉絕對重新整理

        函式格式:void ob_implicit_flush([int flag])

        說明:預設關閉緩衝區,開啟絕對輸出後,每個指令碼都直接傳送到瀏覽器,不再需要使用flush()

     8)ob_clean()清空緩衝區內容,但並不會銷燬緩衝區

       寫程式碼的時候提示出來這樣一個函式,注意和ob_end_clean()區別,這裡補上。

    3.flush()深入

    他的作用是,重新整理快取(cache),這樣的輸出會在資料量超過256時才會被源源不斷的輸出。

<?php
for ($i = 0;  $i< 300; $i++) {
    echo $i.'-<br/>';
    sleep(0.9);
<span style="font-family:Courier New;font-size:14px;color:#330000;">}</span>
這裡與上面不同的是,會直接輸出,並不會到達一定量才往外擠。直接使用ob_implicit_flush()寫在最開始,就不再需要使用flush()
<?php
for ($i = 0;  $i< 20; $i++) {
    echo "$i";
   flush();
   sleep(2);
}

    4.ob系列深入

     我在看到別人寫的這個例子的時候,有些想法

<?php
ob_start();//開啟緩衝區域
phpinfo();//使用phpinfo()函式
$info=ob_get_flush();//將緩衝區內的資料儲存到變數中
file_put_contents('test.txt', $info);
ob_end_clean();<span style="font-family:Courier New;">//關閉輸出</span>
     原本對於phpinfo()這樣的直接輸出函式我們是束手無策的,但是利用緩衝區輸出可以獲得phpinfo()內容,這裡要注意的是,瀏覽器還是會將phpinfo()列印到瀏覽器上,具體原因我也不清楚,大家找到原因了一定要告訴我。但是
<?php
ob_start();
echo '1234';
ob_end_clean();
這樣子使用是不會直接輸出到瀏覽器,我們可以利用這個特性做模版快取。
    

     我在閱讀別人部落格的時候也提到了這些:

     一、靜態模版技術(高大上的感覺底褲脫下來,感覺就沒什麼了)

     這個高大上的說法是指:當用戶訪問一次以後,頁面內容沒有更新的情況下,我們快取為靜態HTML,當用戶再次訪問的時候直接讀取上一訪問的檔案,極大的減小系統的壓力。看到phpinfo()我想大家都想到了。但這裡要說明的是,這個使用者在跳轉後就需要重新開啟一個空間,所以要求我們在跳轉之前另外做儲存。

相關推薦

phpob_start()系列函式的使用

    我在看《php設計模式》的時候看到一個有趣的函式ob_start(),查了一下網友的部落格,滿心歡喜,我們在平時做模版快取會選擇Smart,實際上我們可以自己來,不借助其他工具,對於我這樣對程式碼控制慾強的人來說簡直好東西。輸出控制函式可以幫助我們自由的控制php指

php的匿名函式和閉包

一:匿名函式 (在php5.3.0 或以上才能使用)      php中的匿名函式(Anonymous functions), 也叫閉包函式(closures), 允許指定一個沒有名稱的函式。最常用的就是回撥函式的引數值。(http://php.net/m

PHP的MD5()函式漏洞

文章目錄 1. MD5函式漏洞 2.PHP特性 3.MD5碰撞 1. MD5函式漏洞 $_GET['a'] != $_GET['b'] && MD5($_GET['a']) == MD5($_GE

php的匿名函式和閉包(closure)

一:匿名函式 (在php5.3.0 或以上才能使用)      php中的匿名函式(Anonymous functions), 也叫閉包函式(closures), 允許指定一個沒有名稱的函式。最常用的就是回撥函式的引數值。(http://php.net/m

PHP的strpos()函式

strpos()函式是用來查詢字串首次出現的位置,返回型別為int,但是如是找不到該字元,返回布林型的false值。 1.判斷一個字串是否包含另一個字串,示例程式碼如下: <?php header('content-type:text/html;charset=utf-8'); $a

php常用的函式

strpos() 判斷字串中是否包含某字串,有的話返回其未知,沒有話返回false 錯誤用法: if(strpos('www.idc-gz.com','idc-gz') ){   echo '包含'; }else{   echo '不包含';} 理由: 上面也能得出正確的結果,但方法是錯誤的

PHP常用的函式列表(收藏起來慢慢記)

usleep() 函式延遲程式碼執行若干微秒。unpack() 函式從二進位制字串對資料進行解包。uniqid() 函式基於以微秒計的當前時間,生成一個唯一的 ID。time_sleep_until() 函式延遲程式碼執行直到指定的時間。time_nanosleep() 函式延遲程式碼執行若干秒和納秒。s

PHP呼叫mail()函式傳送郵件所需sendmail的基本配置和html格式的郵件資訊

首先從http://glob.com.au/sendmail上下載sendmail壓縮包;並將其解壓到D:盤中(一般最好不要解壓到C:盤,且目錄不要太長)。 設定一下PHP.ini檔案: [mail function] ; For Win32 only. ; http://

php使用mb_strlen()函式和mb_substr()函式

php預設是不支援mb_strlen()函式的,需要安裝擴充套件模組。安裝方法如下: yum install php-mbstring 找到mbstring.so的位置,可以使用rpm -ql 安裝的rpm名 修改/etc/php.ini配置檔案,增加 exten

PHPMySQL相關函式

mysql_affected_rows — 取得前一次 MySQL 操作所影響的記錄行數 mysql_client_encoding — 返回字符集的名稱 mysql_close — 關閉 MySQL 連線 mysql_connect — 開啟一個到 MySQL 伺服器的連線 mysql_creat

Linuxexec系列函式的應用

這段時間在研究linux中使用者登陸和shell執行程式的原理。我們知道,shell命令分為內部命令和外部命令,內部命令有諸如cd,history,exit,echo等,常見的外部命令有ls,ping,netstat等,通過type命令可以檢視一個命令是內部命令還是外部命令

php的sprintf()函式的format格式字串

上次碰到的ASCII碼問題,檢視別人部落格時,發現使用sprintf(),可以來輸出。這個輸出函式,以前也看了好多次,然而並未仔細看它的用途。這次就徹底檢視手冊,整明白,到底可以做什麼。就有了如下的文件翻譯,因中文文件該函式文件也是英文,只能是自己有限的翻譯下: form

PHP遞迴函式的一個常見邏輯問題

首先,我們得知道遞迴函式是什麼東西,通俗來講也就是自己呼叫自己本身的函式。 現在需要設計一段程式碼,解決1到10疊加的問題。 程式碼A: <?php //遞迴函式 $num=10; function add($sum){ static $tot; if

PHP 的mktime()函式

上週寫一個介面,用到了本週的開始時間和結束時間作為篩選條件去篩選資料,我只記得有mktime()這個函式,具體怎麼用的不太清楚,於是百度之,找到了這個:本週開始時間:date("Y-m-d H:i:s"

php的mail函式可以直接發郵件

<?php $subject = "test"; $content = "testcontent"; $to = '[email protected]';

Linuxbacktrace()系列函式的應用例項

一、引言 backtrace()系列函式可用來輸出程式碼出錯時的函式呼叫關係。 A backtrace is the series of currently active function calls for the program.  #include <ex

php一些簡單函式

1. 替換字串的內容 $beginTime = str_replace ( "%20", " ", $beginTime ); 解釋: 把$beginTime中的'%20'替換成空格 2. 用特定字串把一個字串分割成陣列 $ss = explode ( "_", $

tensorflow的reduce_xx系列函式

所謂reduce就是降維的意思, 我們以reduce_sum函式為例 呼叫reduce_sum(arg1, arg2)時,引數arg1即為要求和的資料,arg2有兩個取值分別為0和1,通常用reduction_indices=[0]或reduction_indices=[1]來傳遞引數。

PHP的一些常用函式

<?php //===============================時間日期=============================== //y返回年最後兩位,Y年四位數,m月份數字,M月份英文。d月份幾號數字,D星期幾英文 $date=date("Y-m-d"); $date=dat

PHP什麼是關鍵字,操作符和函式

PHP中什麼是關鍵字,操作符和函式? 關鍵字 所謂關鍵字就是已被:語言本身使用, 不能作其它用途使用的字。 操作符 操作符是在表示式中用於連線不同物件的運算子,不同的操作符指定了不同的運算方式。 可以把操作符理解為語言內建的,最基礎的函式,不可代替的函式! 操作符本質上也是