[재인쇄] 원본 주소: http://www.itbbs.cn/index.php?showtopic=1074
출력 제어 기능을 사용하면 스크립트 내 데이터의 출력을 자유롭게 제어할 수 있습니다. 이는 특히 데이터가 출력된 후 파일 헤더를 출력하려는 경우 매우 유용합니다. 출력 제어 기능은 header() 또는 setcookie()를 사용하여 전송된 파일 헤더 정보에는 영향을 미치지 않으며 echo() 및 PHP 코드와 유사한 데이터 블록에만 영향을 미칩니다.
모든 사람에게 출력 제어에 대한 일반적인 인상을 주기 위해 먼저 간단한 예를 들어 보겠습니다.
예 1.
<span><code><span><br> <span><?php <BR>ob_start</SPAN><SPAN>(); </SPAN><SPAN>//打开缓冲区 <BR></SPAN><SPAN>echo </SPAN><SPAN>"Hellon"; //输出 <BR>header("</SPAN><SPAN>location</SPAN><SPAN>:</SPAN><SPAN>index</SPAN><SPAN>.</SPAN><SPAN>php</SPAN><SPAN>"); //把浏览器重定向到index.php <BR>ob_end_flush();//输出全部内容到浏览器 <BR>?> <br> </span></span>
ob_start() //오픈 버퍼 SPAN >echo "Hellon"; //출력 header("위치:index .php"); //브라우저를 index.php로 리디렉션 ob_end_flush();//모든 콘텐츠를 브라우저에 출력 ?> <span><div class="code">
<span><?php <CODE><SPAN><BR><SPAN><?php <BR></SPAN><SPAN>for(</SPAN><SPAN>$i </SPAN><SPAN>= </SPAN><SPAN>1</SPAN><SPAN>; </SPAN><SPAN>$i </SPAN><SPAN><= </SPAN><SPAN>300</SPAN><SPAN>; </SPAN><SPAN>$i</SPAN><SPAN> ) print(</SPAN><SPAN>" "</SPAN><SPAN>); <BR></SPAN><SPAN>// 这一句话非常关键,cache的结构使得它的内容只有达到一定的大小才能从浏览器里输出 <BR>// 换言之,如果cache的内容不达到一定的大小,它是不会在程序执行完毕前输出的。经 <BR>// 过测试,我发现这个大小的底限是256个字符长。这意味着cache以后接收的内容都会 <BR>// 源源不断的被发送出去。 <BR></SPAN><SPAN>For(</SPAN><SPAN>$j </SPAN><SPAN>= </SPAN><SPAN>1</SPAN><SPAN>; </SPAN><SPAN>$j </SPAN><SPAN><= </SPAN><SPAN>20</SPAN><SPAN>; </SPAN><SPAN>$j</SPAN><SPAN> ) { <BR>echo </SPAN><SPAN>$j</SPAN><SPAN>.</SPAN><SPAN>" <BR>"</SPAN><SPAN>; <BR></SPAN><SPAN>flush</SPAN><SPAN>(); </SPAN><SPAN>//这一部会使cache新增的内容被挤出去,显示到浏览器上 <BR></SPAN><SPAN>sleep</SPAN><SPAN>(</SPAN><SPAN>1</SPAN><SPAN>); </SPAN><SPAN>//让程序"睡"一秒钟,会让你把效果看得更清楚 <BR></SPAN><SPAN>} <BR></SPAN><SPAN>?></span> <br><span> for(</span>$i <span>= </span><span>1</span><span>; </span><span>$i </span><span><= </SPAN ><SPAN>300</SPAN><SPAN>; </SPAN><SPAN>$i</SPAN><SPAN> ) 인쇄(</SPAN><SPAN>" "</ SPAN><SPAN>); </p></SPAN><SPAN>// 이 문장은 캐시의 구조상 콘텐츠가 특정 크기에 도달한 경우에만 브라우저에서 출력될 수 있도록 되어 있습니다. <🎜>// 즉, 캐시의 내용이 일정 크기에 도달하지 못하면 프로그램 실행이 완료되기 전에는 해당 크기가 출력되지 않습니다. <🎜>// 테스트 결과 이 크기의 하한이 256자임을 확인했습니다. 이는 앞으로 캐시에 수신된 콘텐츠가 지속적으로 전송된다는 의미입니다<🎜>//. <🎜></SPAN><SPAN>(</SPAN><SPAN>$j </SPAN><SPAN>= </SPAN><SPAN>1</SPAN><SPAN>; </SPAN>< SPAN>$j </SPAN><SPAN><= </SPAN><SPAN>20</SPAN><SPAN> </SPAN><SPAN>$j</SPAN><SPAN> ) { <🎜 >에코 </SPAN><SPAN>$j</SPAN><SPAN>.</SPAN><SPAN>" <🎜>"</SPAN><SPAN> <🎜></SPAN><SPAN>플러시 </SPAN><SPAN>(); </SPAN><SPAN>//이 부분은 캐시에서 새 콘텐츠를 짜내고 <🎜></SPAN><SPAN>잠자기</SPAN에 표시합니다. ><SPAN>(</SPAN><SPAN>1</SPAN><SPAN>) </SPAN><SPAN>//프로그램을 1초 동안 "휴면" 상태로 두어 효과를 더 많이 확인할 수 있습니다. 명확하게 지우기 <🎜></SPAN><SPAN>} <🎜></SPAN><SPAN>?></span> <br>참고: 절대 새로 고침을 켜기 위해 프로그램 시작 부분에 ob_implicit_flush()를 추가하면 프로그램에서 더 이상 플러시()를 사용할 수 없습니다. 이렇게 하면 효율성이 향상됩니다. <br>2. ob 시리즈 기능에 관하여: <br>먼저 나의 좋은 친구 y10k의 예를 인용하고 싶습니다: <br>예 3. <br>예를 들어, 서버의 설정 정보를 사용하고 하지만 이 정보는 클라이언트마다 다르기 때문에 phpinfo() 함수의 출력을 저장하려면 어떻게 해야 할까요? 버퍼 제어가 없었기 전에는 전혀 방법이 없었다고 할 수 있지만, 버퍼 제어를 사용하면 쉽게 해결할 수 있습니다: <br><div class="code">
<code><span><code><span><br><span><?php <BR>ob_start</SPAN><SPAN>(); </SPAN><SPAN>//打开缓冲区 <BR></SPAN><SPAN>phpinfo</SPAN><SPAN>(); </SPAN><SPAN>//使用phpinfo函数 <BR></SPAN><SPAN>$info</SPAN><SPAN>=</SPAN><SPAN>ob_get_contents</SPAN><SPAN>(); </SPAN><SPAN>//得到缓冲区的内容并且赋值给$info <BR></SPAN><SPAN>$file</SPAN><SPAN>=</SPAN><SPAN>fopen</SPAN><SPAN>('</SPAN><SPAN>info.txt</SPAN><SPAN>'</SPAN><SPAN>,</SPAN><SPAN>'</SPAN><SPAN>w</SPAN><SPAN>'</SPAN><SPAN>); //打开文件info.txt <BR>fwrite($file,$info); //写入信息到info.txt <BR>fclose($file); //关闭文件info.txt <BR>?> <br></span></span>
< ?php ob_start(); //버퍼 열기 <span><br><span><?php <BR>ob_start</SPAN><SPAN>();</SPAN><SPAN>//打开缓冲区 <BR></SPAN><SPAN>?></span> <br>php页面的全部输出 <br><span><? <BR>$content </SPAN><SPAN>= </SPAN><SPAN>ob_get_contents</SPAN><SPAN>();</SPAN><SPAN>//取得php页面输出的全部内容 <BR></SPAN><SPAN>$fp </SPAN><SPAN>= </SPAN><SPAN>fopen</SPAN><SPAN>(</SPAN><SPAN>"output00001.html"</SPAN><SPAN>, </SPAN><SPAN>"w"</SPAN><SPAN>); </SPAN><SPAN>//创建一个文件,并打开,准备写入 <BR></SPAN><SPAN>fwrite</SPAN><SPAN>(</SPAN><SPAN>$fp</SPAN><SPAN>, </SPAN><SPAN>$content</SPAN><SPAN>); </SPAN><SPAN>//把php页面的内容全部写入output00001.html,然后…… <BR></SPAN><SPAN>fclose</SPAN><SPAN>(</SPAN><SPAN>$fp</SPAN><SPAN>); <BR></SPAN><SPAN>?></span> <br></span>
저는 정적 출력을 얻는 두 가지 방법을 알고 있습니다: <1>. y10k에 의해 수정된 phplib의 template.inc.php라는 클래스를 통해 구현됩니다. <2>. ob 시리즈 기능을 사용해 구현해보세요. 첫 번째 방법에 대해서는 이 글에서 다룰 내용이 아니므로 자세히 다루지는 않겠습니다. 이제 두 번째 방법의 구체적인 구현을 살펴보겠습니다. 예제 4. <span><span><?php <🎜>ob_start< /SPAN><SPAN>();</SPAN><SPAN>//버퍼 열기 <🎜></SPAN><SPAN>?></span> php 페이지의 모든 출력 <? <🎜>$content </SPAN><SPAN>= </SPAN><SPAN>ob_get_contents</SPAN><SPAN>();</SPAN><SPAN>//PHP 페이지 가져오기 출력 모든 콘텐츠 <🎜></SPAN><SPAN>$fp </SPAN><SPAN>= </SPAN><SPAN>fopen</SPAN><SPAN>(</SPAN><SPAN>"output00001.html " </SPAN><SPAN>, </SPAN><SPAN>"w"</SPAN><SPAN>); </SPAN><SPAN>//파일을 만들고 쓰기 위해 엽니다 <🎜></ / SPAN><SPAN>fwrite</SPAN><SPAN>(</SPAN><SPAN>$fp</SPAN><SPAN>, </SPAN><SPAN>$content</SPAN><SPAN>) < /SPAN><SPAN>//php 페이지의 모든 내용을 output00001.html에 쓴 다음... <🎜></SPAN><SPAN>fclose</SPAN><SPAN>(</SPAN>< SPAN> $fp</SPAN><SPAN>) <🎜></SPAN><SPAN>?></span>
<span><code><span><br><span><? <BR></SPAN><SPAN>Function </SPAN><SPAN>run_code</SPAN><SPAN>(</SPAN><SPAN>$code</SPAN><SPAN>) { <BR>If(</SPAN><SPAN>$code</SPAN><SPAN>) { <BR></SPAN><SPAN>ob_start</SPAN><SPAN>(); <BR>eval(</SPAN><SPAN>$code</SPAN><SPAN>); <BR></SPAN><SPAN>$contents </SPAN><SPAN>= </SPAN><SPAN>ob_get_contents</SPAN><SPAN>(); <BR></SPAN><SPAN>ob_end_clean</SPAN><SPAN>(); <BR>}else { <BR>echo </SPAN><SPAN>"错误!没有输出"</SPAN><SPAN>; <BR>exit(); <BR>} <BR>return </SPAN><SPAN>$contents</SPAN><SPAN>; <BR>} <BR></SPAN></SPAN>
함수 run_code($code ) { <🎜>If($code) { <🎜>ob_start() < 🎜>eval($code) <🎜>$contents = ob_get_contents (); <🎜>ob_end_clean() <🎜>}else { <🎜>echo "오류 ! 출력 없음"; <🎜>exit(); <🎜>} <🎜>return $contents; <🎜>} <🎜 ><🎜><SPAN><BR><SPAN><? <BR></SPAN><SPAN>/* <BR>** Title.........: PHP4 HTTP Compression Speeds up the Web <BR>** Version.......: 1.20 <BR>** Author........: catoc <[email]catoc@163.net[/email]> <br>** Filename......: gzdoc.php <br>** Last changed..: 18/10/2000 <br>** Requirments...: PHP4 >= 4.0.1 <br>** PHP was configured with --with-zlib[=DIR] <br>** Notes.........: Dynamic Content Acceleration compresses <br>** the data transmission data on the fly <br>** code by sun jin hu (catoc) <[email]catoc@163.net[/email]> <br>** Most newer browsers since 1998/1999 have <br>** been equipped to support the HTTP 1.1 <br>** standard known as "content-encoding." <br>** Essentially the browser indicates to the <br>** server that it can accept "content encoding" <br>** and if the server is capable it will then <br>** compress the data and transmit it. The <br>** browser decompresses it and then renders <br>** the page. <br>** <br>** Modified by John Lim ([email]jlim@natsoft.com.my[/email]) <br>** based on ideas by Sandy McArthur, Jr <br>** Usage........: <br>** No space before the beginning of the first '<?' tag. <BR>** ------------Start of file---------- <BR>** |<? <BR>** | include('gzdoc.php'); <BR>** |? > <br>** |<HTML> <br>** |... the page ... <br>** |</HTML> <br>** |<? <BR>** | gzdocout(); <BR>** |? > <br>** -------------End of file----------- <br>*/ <br></span><span>ob_start</span><span>(); <br></span><span>ob_implicit_flush</span><span>(</span><span>0</span><span>); <br>function </span><span>CheckCanGzip</span><span>(){ <br>global </span><span>$HTTP_ACCEPT_ENCODING</span><span>; <br>if (</span><span>headers_sent</span><span>() || </span><span>connection_timeout</span><span>() || </span><span>connection_aborted</span><span>()){ <br>return </span><span>0</span><span>; <br>} <br>if (</span><span>strpos</span><span>(</span><span>$HTTP_ACCEPT_ENCODING</span><span>, '</span><span>x-gzip</span><span>'</span><span>) !== false) return "x-gzip"; <br>if (strpos($HTTP_ACCEPT_ENCODING,</span><span>'</span><span>gzip</span><span>'</span><span>) !== false) return "gzip"; <br>return 0; <br>} <br>/* $level = compression level 0-9, 0=none, 9=max */ <br>function GzDocOut($level=1,$debug=0){ <br>$ENCODING = CheckCanGzip(); <br>if ($ENCODING){ <br>print "n<!-- Use compress $ENCODING -->n"; <br>$Contents = ob_get_contents(); <br>ob_end_clean(); <br>if ($debug){ <br>$s = "<p>Not compress length: ".strlen($Contents); <br>$s .= " <br>Compressed length: ".strlen(gzcompress($Contents,$level)); <br>$Contents .= $s; <br>} <br>header("Content-Encoding: $ENCODING"); <br>print "x1fx8bx08x00x00x00x00x00"; <br>$Size = strlen($Contents); <br>$Crc = crc32($Contents); <br>$Contents = gzcompress($Contents,$level); <br>$Contents = substr($Contents, 0, strlen($Contents) - 4); <br>print $Contents; <br>print pack(</span><span>'</span><span>V</span><span>'</span><span>,$Crc); <br>print pack(</span><span>'</span><span>V</span><span>'</span><span>,$Size); <br>exit; <br>}else{ <br>ob_end_flush(); <br>exit; <br>} <br>} <br>?> <br></span></span>
위 내용은 PHP의 ob_start를 사용하여 브라우저 캐시를 제어하는 방법을 소개했으며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.