ホームページ  >  記事  >  バックエンド開発  >  PHP_PHP チュートリアルでの出力バッファリング

PHP_PHP チュートリアルでの出力バッファリング

WBOY
WBOYオリジナル
2016-07-13 10:29:17961ブラウズ


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


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

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


        www.bkjia.comtruehttp://www.bkjia.com/PHPjc/777562.htmlTechArticle在PHP中,当执行echo,print的时候,输出并没有立即通过tcp传给客户端浏览器显示, 而是将数据写入php buffer。php output_buffering机制,意味在tcp...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。