>백엔드 개발 >PHP 튜토리얼 >PHP 출력 캐시를 기반으로 하는 output_buffering 예제에 대한 자세한 설명

PHP 출력 캐시를 기반으로 하는 output_buffering 예제에 대한 자세한 설명

伊谢尔伦
伊谢尔伦원래의
2017-06-24 13:35:191426검색

먼저 PHP의 출력 순서를 명확히 합니다. echo,print -> 서버 버퍼링 -> 브라우저 2 .php 출력 캐시가 켜져 있지 않습니다:

echo, print -> 서버 버퍼링 -> 브라우저 버퍼링 -> 브라우저의 출력 캐시도 명확히 하세요: IE는 256바이트, Chrome 및 FireFox는 1000바이트입니다. 데이터 도달 브라우저는 이 길이 또는 스크립트가 끝난 후에만 페이지에 데이터를 출력합니다

사용된 여러 PHP 설정 및 API에 대해 이야기해 봅시다:output_buffering 구성 1.php.ini
•꺼짐: 다음을 의미합니다. PHP 출력 캐시 끄기•On: 무한 출력 캐시 켜기•4096: 4096Byte 크기의 출력 캐시 켜기


2.php.ini implicit_flush 구성
•On: 각 출력을 나타냅니다(예: echo, print) Flush() 함수를 자동으로 호출한 후 바로 출력합니다.
•Off: On과 반대로 각 출력 후에는 flash()가 호출되지 않지만 서버 버퍼링이 가득 찰 때까지 출력하지 않습니다. 이를 대체하려면 플러시() 함수를 사용하세요. 활성화되어 있지 않아도 상관없습니다. 더 유연합니다


3.
ob_flush
() 함수: PHP 버퍼링에서 데이터를 꺼내 서버에 넣습니다. buffering
4.flush() 함수: 서버 버퍼링에서 데이터를 꺼내어 브라우저 버퍼링



5.ob_start() 함수:
지금은 이 함수에 대해 잘 모르겠습니다. 왜냐하면 그것이 켜진 후에는 ob_flush()와 플러시()가 사용되더라도 출력은 ob_flush()에 의해 제어되지 않기 때문입니다. 이제 알려진 것은 output_buffering=Off인 경우입니다. , ob_start()를 사용해도 출력 데이터를 캐시할 수 없고,output_buffering=On이면 ob_start()를 사용하지 않아도 출력 데이터를 PHP로도 캐시할 수 있기 때문에 ob_start는 쓸모가 없다고 생각하므로 일단은 신경쓰지 않겠습니다

그럼 코드를 살펴보겠습니다(output_buffering=4096, implicit_flush=Off로 설정)

<html>
     <body>
         <?php
             // ob_start();    //这玩意开了就会不正常,输出不受ob_flush()控制,不知道到底干嘛用
             // echo str_repeat(&#39; &#39; ,1000);    //IE缓存256Bytes
             echo str_repeat(&#39; &#39; ,1000);    //Chrome和FF缓存1000Bytes,这里用来先将浏览器缓存用掉,但是很疑惑这一行输出为什么没有被output_buffering存起来,而是直接输出了
             for($i=0;$i<5;$i++) {
                 echo $i.&#39;<br />&#39;;
                 ob_flush();
                 flush();
                 sleep(1);
             }
         ?>
     </body>
 </html>
여기 코드의 출력은 한 줄씩 출력되는 것으로 구체적인 원리는 참고해주세요 ob_flush() 및 플러시() 함수. 이 두 함수 중 하나라도 없으면 내 설정에서는 0, 1, 2, 3, 4가 캐시될 때까지 기다렸다가 마지막으로 함께 출력해야 합니다. Laruence 블로그의 한 문단, 여러분의 이해에 도움이 되었으면 좋겠습니다설명서의 ob_flush/flush 설명은 출력 버퍼를 새로 고침하는 것이며, 이 역시 함께 사용해야 하므로 많은 분들에게 혼란을 줄 수 있습니다. ...
사실, 그들은 다른 객체에서 작동합니다. 어떤 경우에는

ob_* 함수 시리즈가 PHP 자체의 출력 버퍼를 작동합니다.


그래서 ob_flush는 PHP의 버퍼를 새로 고칩니다.

엄밀히 말하면 이는 PHP가 Apache의 Module(핸들러 또는 필터)으로 설치된 경우에만 실제 효과가 있습니다(특히 Apache로 간주될 수 있음). Apache 모듈의 sapi인 플러시는 sapi_module의 플러시 멤버

함수 포인터

를 호출하여 간접적으로 Apache의 API를 호출합니다. ap_rflush는 Apache의 출력 버퍼를 새로 고칩니다. 물론 설명서에는 Apache의 다른 모듈도 있다고 나와 있습니다.

1. mod_gzip과 같은 일부 Apache 모듈은 자체적으로 출력 캐싱을 수행할 수 있습니다.

2 이로 인해 플러시() 함수에 의해 생성된 결과가 즉시 클라이언트 브라우저.

3.

4. 브라우저도 수신된 콘텐츠를 표시하기 전에 캐시합니다. 예를 들어 Netscape

5. 브라우저는 줄 바꿈이나 html 태그의 시작 부분을 받을 때까지 콘텐츠를 캐시하며,

6 태그를 받을 때까지 전체 테이블은 표시되지 않습니다.

7.

8. 일부 버전의 Microsoft Internet Explorer는 256 9.바이트를 받은 후에만 페이지를 표시하기 시작하므로 이러한 10.

따라서 두 가지를 사용하는 올바른 순서는 먼저 ob_flush, 그 다음 플러시입니다.

물론 다른 sapi에서는 플러시를 호출할 수 없지만 코드의 이식성을 보장하기 위해 사용하는 것이 좋습니다. 함께.

위 내용은 PHP 출력 캐시를 기반으로 하는 output_buffering 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.