PHP での出力バッファリング

WBOY
リリース: 2016-06-21 08:48:08
オリジナル
1037 人が閲覧しました


PHP では、echo と print が実行されると、出力は tcp を介して表示のためにクライアント ブラウザにすぐに送信されませんが、データは php バッファに書き込まれます。 phpのoutput_bufferingメカニズムは、tcpバッファの前に新しいキューが確立され、データがそのキューを通過する必要があることを意味します。 PHP バッファーがいっぱいになると、スクリプト プロセスは PHP バッファー内の出力データをシステム カーネルに渡し、表示のために TCP 経由でブラウザーに渡します。したがって、データは、echo/pring -> php バッファ -> tcp バッファ -> ブラウザ

の順序でこれらの場所に書き込まれます。


PHP にはリフレッシュ バッファリングに関連する関数が 3 つあります:

1).flush
PHP が実行される状況に関係なく、PHP プログラムのバッファをフラッシュします。この関数は、これまでのプログラムの出力をすべてユーザーのブラウザに送信します。 ただし、この関数はサーバーまたはクライアントのブラウザーのキャッシュ モードに影響を与えず、また PHP 自体のキャッシュにも影響を与えません。

2).ob_flush

この関数はPHP自体のキャッシュを出力します。 PHP 自体のキャッシュは、php.ini の output_buffering によって制御されます。 ob_flush() の機能は、元々出力キャッシュに格納されていたコンテンツを取り出して出力待機状態に設定することですが、この場合、最初に ob_flush() を使用する必要があります。次に、flush() を実行すると、クライアントはスクリプトの出力をすぐに取得します。

PHP 自体の出力バッファリングに関連する 2 つの PHP 構成は次のとおりです:
パラメータ 1: output_buffering : オン/オフ または整数 。オンに設定すると、出力キャッシュ コントロールはキャッシュのサイズを制限せずにすべてのスクリプトで使用されます。 Output_buffering=4096 などの整数に設定すると、キャッシュされたデータが 4096 バイトに達すると、キャッシュが自動的に出力され、更新されます。このパラメータの違いが、上記のコードの実行結果が異なるタイミングで異なる理由です。 Output_buffering がオフになっている場合、スクリプトのすべての出力 (エコー) は、上記のコードが実行されるとすぐにクライアントに送信され、1 秒ごとに数値が出力されます。 Output_buffering がオンになった後は、出力コンテンツが最初にキャッシュされます。 サーバー側では、スクリプトが終了するまでクライアントに送信されません。
パラメータ 2: implicit_flush: オン/オフ。 ON に設定すると、スクリプトが出力されるとすぐに自動的にクライアントに送信されます。これは、echo の後に flash() を自動的に追加するのと同じです。


3).ob_implicit_flush

この関数は、出力があるたびに出力を直ちにブラウザに強制的に送信します。この方法では、各出力 (エコー) の後にフラッシュ() を使用してブラウザに送信する必要はありません。


  1. ob_end_clean();
  2. echo str_pad(" ", 256); for ($i=100; $i>0;
  3. $i--) {
  4. エコー $i, '';
    flush();
  5. スリープ(1);
  6. ?>
  7. 上記のコードは 1 秒ごとに $i を出力する必要があります。 上記のエコー。 str_pad(" ", 256) の目的は、IE が表示を開始する前に 256 バイトを受信する必要があることです。 上記のコードは、次の 2 つの方法で記述することもできます。
  8. echo
    str_pad("
      ",
    1. 256); for ($i=100; $i>0;
    2. $i--) {
    3. エコー $i, '/>';
    4. ob_flush(); //フラッシュだけでは不十分な場合があります
      flush();
    5. スリープ(1);
    6. ?> 平野を見る
    7. ob_implicit_flush(true);
    8. echo
      str_pad("
        ",
      1. 256); for ($i=100; $i>0;
      2. $i--) {
      3. エコー $i,
      4. '/>';
      5. ob_flush();
        スリープ(1);
      6. ?>
      7. さらに、リフレッシュ バッファーは上記の側面だけでなく、次の側面からも影響を受けるという事実にも注意する必要があります。 1) 一部の Web サーバー プログラム、特に Win32 での Web サーバー プログラムは、結果をブラウザーに送信する前に、プログラムの終了までスクリプトの出力をキャッシュします。 mod_gzip などの一部の Apache モジュールは、それ自体で出力キャッシュを実行する場合があるため、flush() 関数の結果がクライアントのブラウザにすぐに送信されなくなります。ブラウザでも、受信したコンテンツを表示する前にキャッシュします。たとえば、Netscape ブラウザは次のようになります。 タグの開始前と の受信後にコンテンツをキャッシュします。マークを付ける前は、表全体が表示されません。 Microsoft Internet Explorer の一部のバージョンでは、256 バイトを受信した後にのみページの表示が開始されるため、これらのブラウザでページのコンテンツを表示するには、追加のスペースを送信する必要があります。


        以下は非常に単純なコードです



        <?php
        	/*--------------------编写自己的缓存类---------------*/
        	class my_cache{
        		
        	//定义有关变量
        		private $cache_time;//缓存有效时间
        		private  $cache_file;//缓存文件保存路径
        		
        	//初始化类,默认是index.html时间是1
        		function __construct($cache_file=&#39;index.html&#39;,$cache_time="1"){
        			$this->cache_file=$cache_file;
        			$this->cache_time=$cache_time;			
        		}
        	//缓存开始
        	function cache_start(){
        		
        		if ($this->cache_active){
        			include($this->cache_file);
        			exit;
        	}
        		//开启缓存
        		ob_start();
        		
        	}
        		
        	//判断缓存文件是否存在并且可用
        		function cache_active(){
        				//判断文件是否存在
        			if(file_exists($this->cache_file)){
        				$last_time=@filemtime($this->cache_file);//获取最后修改时间
        				//判断时间是否可用
        				if($this->cache_time<$last_time){
        				//可用,包含进来直接显示
        					return true;
        					}else{
        				//删除该缓存,重新建立缓存
        						unlink($this->cache_file);
        						return false;
        					}				
        			}			
        		}
        		
        	//进行缓存目录的生成
        			function cache_creat(){
        			//不用判断直接生成缓存文件目录及文件,循环生成文件
        			$file=explode("/", $this->cache_file);
        			$num=count($file)-1;
        			for ($i=0;$i<$num;$i++){
        			$tm.=$file[$i]."/";
        				if (!file_exists($tm)){
        					mkdir($tm);
        				}
        			}
        		}
        
        		
        	//缓存的输出
        	function cache_end(){
        		$cache_content=ob_get_contents();
        		$this->cache_creat();
        		$fp=@fopen($this->cache_file, "w+");	
        		fwrite($fp, $cache_content);
        		ob_end_flush();
        	}	
        	
        	//缓存的清除
        	function cache_clean(){
        		if(unlink($this->cache_file)){
        			return true;
        		}else {		
        			$this->alert("缓存删除失败!请检查缓存文件是否存在");
        			return false;
        		}
        		
        	}
        	
        	//定义缓存文件的提醒函数
        	function alert($a){
        		echo "<script>alert(&#39;$a&#39;);</script>";
        		
        	}
        }
        ?>
        
        
        测试页面test.php
        
        <?
        include &#39;cache_my_class.php&#39;;
        $my_cache=new my_cache("./chunge/ge/hao/index.html",5);
        $my_cache->cache_start(); //在页面的最开始 
        
        -------页面输出
         
        $like="我爱吃橘子香蕉!"; 
        echo $like."<br/>";
        $my_cache->cache_end();//最后进行输出
        
        ログイン後にコピー




関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート