1. 程式人生 > >php輸出緩衝區和快取技術實現

php輸出緩衝區和快取技術實現

  • 系統緩衝區定義:一個記憶體地址空間,用來儲存速度不同步的裝置或者優先順序不同的裝置之間儲存資料。例如使用vim編輯器時,系統並不會立即把一個字元寫入 磁碟而是緩衝區,當寫滿時或者呼叫flush()函式時才儲存到磁碟上。

  • php輸出快取區:預設時當echo或者print時,先把輸出文字放在php輸出快取區時,等到快取區滿了或者服務端指令碼結束時才返回給使用者

  • php緩衝區,預設緩衝大小是4096,4K,當緩衝區滿了才會返回給瀏覽器

    public function index()
    {
    	// 
    	for($i=0;$i<10;$i++)
    	{
    		echo "$i"."<br />"
    		sleep(1);
    	}
    }
    
  • 這個是達到緩衝的最大值,每一秒輸出一次

    public function index()
    {
    	ob_end_clean();
    	$str=str_repeat('a', 512);
    	for($i=0;$i<10;$i++)
    	{
    		echo $str.'<br />';
    		flush();   // 把系統緩衝強制返回給瀏覽器
    		sleep(1);
    	}
    }
    
    • 使用ob_start()函式會把緩衝大小範圍變得很大,還是要等待程式結束才一起輸出
    public function index()
    {
    	ob_start();
    	$str=str_repeat('a', 512);
    	for($i=0;$i<10;$i++)
    	{
    		echo $str.'<br />';
    		flush();   // 把系統緩衝強制返回給瀏覽器
    		sleep(1);
    	}
    }
    
  • 將輸出緩衝區內容寫到檔案中去

    public function index()
    {
    	for($i=0;$i<10;$i++)
    	{
    		echo $i.'<br />';
    	}
    	$f=fopen('D:/test/ob.txt','w') or die('檔案不存在');
    	fwrite($f, ob_get_contents());
    }
    
    • 一個檔案時間的概念
      • ctime(change time):狀態修改時間(檔案許可權等) filectime:返回時間戳或者false
      • atime(access time):上一次訪問時間 fileatime
      • mtime(modify time):檔案內容修改時間 filemtime
    • 將html檔案內容寫到檔案中
    <html>
    <head>
    	<title></title>
    </head>
    <body>
       my name is {$name}
    </body>
    </html>
    <?php 
     	$f=fopen('D:/test/ob.html','w') or die('檔案不存在');
    	fwrite($f, ob_get_contents());
    	fclose($f); 
    ?> 
    
    • 簡單快取一個頁面的例子
    public function index()
    {
    	if(cache('index')){
    		return cache('index');
    	}
    	cache('index',view('',['name'=>'power']),10);
    	return view('',['name'=>'power']);
    }
    
    • 一些常用函式
      • ob_start() //開啟一個輸出緩衝區,所有的輸出不再直接傳送給瀏覽器二十緩衝區
      • ob_get_contents() // 獲取快取區中的內容
      • ob_end_clean() // 刪除緩衝區中的內容,關閉緩衝區
      • ob_end_flush() // 傳送內部緩衝區內容到瀏覽器並且關閉輸出緩衝區
      • flush() // 通知作業系統底層,儘快把資料發給客戶端瀏覽器
      • ob_clean() // 刪除緩衝區的內容
      • ob_flush() //把輸出快取區中的內容返回到瀏覽器,刪除緩衝區的內容