>  기사  >  백엔드 개발  >  PHP에서 출력 버퍼 새로 고침에 대한 자세한 설명

PHP에서 출력 버퍼 새로 고침에 대한 자세한 설명

不言
不言원래의
2018-04-23 10:18:081663검색

이 글의 주요 내용은 PHP에서 출력 버퍼를 새로 고치는 것에 대한 자세한 설명입니다. 특정 참조 값이 있습니다. 이제 필요한 친구들이 참조할 수 있습니다.

버퍼는 메모리 주소 공간입니다. Linux 시스템의 기본 크기는 평균 4096(1kb)이며, 이는 하나의 메모리 페이지입니다. 주로 속도가 동기화되지 않은 장치 또는 우선 순위가 다른 장치 간의 데이터 전송 영역을 저장하는 데 사용됩니다. 버퍼를 통해 프로세스는 서로 덜 기다릴 수 있습니다. 다음은 보다 일반적인 예입니다. 파일을 편집하기 위해 텍스트 편집기를 열 때 문자를 입력할 때마다 운영 체제는 해당 문자를 디스크에 직접 쓰지 않고 먼저 버퍼에 씁니다. 버퍼가 가득 차면 버퍼에 있는 데이터가 디스크에 기록됩니다. 물론 커널 함수 플러시()가 호출되면 버퍼에 있는 더티 데이터를 디스크에 다시 쓰는 것이 필수입니다.

              마찬가지로 PHP에서도 echo와 print가 실행되면 출력이 즉시 tcp를 통해 클라이언트 브라우저로 전송되어 표시되는 것이 아니라, 데이터가 PHP 버퍼에 기록됩니다. php 출력_버퍼링 메커니즘은 tcp 버퍼 이전에 새 대기열이 설정되고 데이터가 대기열을 통과해야 함을 의미합니다. PHP 버퍼가 가득 차면 스크립트 프로세스는 PHP 버퍼의 출력 데이터를 시스템 커널로 전달하고 표시를 위해 tcp를 통해 브라우저에 전달합니다. 따라서 데이터는 순서대로 이러한 위치에 기록됩니다. echo/pring -> tcp buffer -> browser


PHP에는 버퍼 새로 고침과 관련된 세 가지 기능이 있습니다. 1) 플러시 PHP가 실행되는 상황에 관계없이 PHP 프로그램의 버퍼를 새로 고칩니다. 이 함수는 지금까지의 모든 프로그램 출력을 사용자의 브라우저로 보냅니다. 그러나 이 기능은 서버나 클라이언트 브라우저의 캐싱 모드에 영향을 미치지 않으며 PHP 자체의 캐싱에도 영향을 미치지 않습니다.

2).ob_flush

이 함수는 PHP 자체의 캐시를 출력합니다. PHP 자체 캐싱은 php.ini의

output_buffering에 의해 제어됩니다. ob_flush()의 기능은 원래 출력 캐시에 저장되어 있던 내용을 꺼내어 출력 대기 상태로 설정하는 것이지만, 클라이언트에 직접 전송되지는 않습니다. 이 경우 먼저 ob_flush()를 사용해야 합니다. 그런 다음 클라이언트가 스크립트의 출력을 즉시 가져오는 플러시()를 수행합니다.

PHP 자체 출력 버퍼링과 관련된 두 가지 PHP 구성은 다음과 같습니다.

매개변수 1: output_buffering: on/off 또는 정수. on으로 설정하면 캐시 크기를 제한하지 않고 모든 스크립트에서 출력 캐시 제어가 사용됩니다. output_buffering=4096과 같이 정수로 설정하면 캐시 데이터가 4096바이트에 도달하면 캐시가 자동으로 출력되고 새로 고쳐집니다. 이 매개변수의 차이는 위 코드가 시점에 따라 실행 결과가 달라지는 이유입니다. output_buffering을 끄면 스크립트의 모든 출력(echo)이 즉시 클라이언트로 전송됩니다. 위 코드가 실행되면 1초마다 숫자가 출력됩니다. output_buffering이 켜진 후 출력 콘텐츠는 먼저 서버에 캐시되고 스크립트가 끝날 때까지 클라이언트로 전송되지 않습니다.

매개변수 2:

implicit_flush
: 켜기/끄기. ON으로 설정하면 스크립트에 출력이 있을 때 자동으로 클라이언트에 즉시 전송됩니다. 이는 echo 뒤에 자동으로 플러시()를 추가하는 것과 동일합니다.
3).ob_implicit_flush

이 함수는 출력이 있을 때마다 즉시 출력을 브라우저로 강제로 전송합니다. 이런 방식으로 각 출력(에코) 후에 브라우저에 보내기 위해 플러시()를 사용할 필요가 없습니다.
다음은 예입니다.



[php] 일반 보기 복사



  1. <?php  
    ob_end_clean();  
    echo str_pad(" ", 256);  
    for ($i=100; $i>0; $i--) {  
       echo $i, &#39;<br/>&#39;;  
       flush();  
       sleep(1);   
    }   
    ?>

위의 코드는 1초마다 $i를 출력해야 합니다. (" ", 256)의 목적은 IE가 표시를 시작하기 전에 256바이트를 수신해야 한다는 것입니다. 위의 코드는 다음 두 가지 방법으로도 작성할 수 있습니다.





[php] 일반 보기 복사



    <?php  
    echo str_pad(" ", 256);  
    for ($i=100; $i>0; $i--) {  
       echo $i, &#39;<br />&#39;;  
       ob_flush();  
       flush();  
       sleep(1);   
    }   
    ?>




[php] view plain copy



    <?php  
    ob_implicit_flush(true);  
    echo str_pad(" ", 256);  
    for ($i=100; $i>0; $i--) {  
       echo $i, &#39;<br />&#39;;  
       ob_flush();  
       sleep(1);   
    }   
    ?>


또한 주의할 점은 영향을 받는 버퍼 위의 측면에서는 다음 영향에도 영향을 받습니다.


1) 일부 웹 서버 프로그램, 특히 Win32의 웹 서버 프로그램은 결과를 브라우저로 보내기 전에 프로그램이 끝날 때까지 스크립트 출력을 캐시합니다. mod_gzip과 같은 일부 Apache 모듈은 자체적으로 출력 캐싱을 수행할 수 있으며 이로 인해 flush() 함수로 생성된 결과가 즉시 클라이언트 브라우저로 전송되지 않습니다. 브라우저도 수신된 콘텐츠를 표시하기 전에 캐시합니다. 예를 들어, Netscape 브라우저는 줄 바꿈이나 html 태그의 시작 부분을 받을 때까지 콘텐츠를 캐시하고 f16b1740fad44fb09bfe928bcc527e08 태그를 받을 때까지 전체 테이블을 표시하지 않습니다. 일부 버전의 Microsoft Internet Explorer는 256바이트를 수신한 후에만 페이지 표시를 시작하므로 이러한 브라우저가 페이지 콘텐츠를 표시하려면 일부 추가 공간을 보내야 합니다.

2) PHP 설치 모드의 영향. 위 방법은 PHP가 Apache 모듈로 설치된 경우 바로 사용할 수 있습니다. FastCgi를 사용하는 경우 다음 구성에 주의해야 합니다.

a) Apache+Fcgid+PHP
FcgidOutputBufferSize 0(기본값은 65536)

Fcgid를 구성할 때 이 값을 0으로 설정하면 위 코드는 원하는 효과를 얻기 위한 새로 고침 버퍼 시간.

b).IIS+FastCgi+PHP

ResponseBufferLimit=0

WINDOWSsystem32inetsrvfcgiext.ini에서 이 항목을 수정합니다. ​​​​class="line alt2" style="margin:0px;padding:0px;color:rgb(69,69,69); background-color:rgb(255,255,255);font-family:Arial;font-size :14px;line -height:26px;">

fastcgi_buffers 8 4k;

                 fastcgi_busy_buffers_size 4k

fastcgi_buffer_size 4k;

        fastcgi_buffers 8 4k;<br>        fastcgi_busy_buffers_size 4k<br>

        gzip off;

相关推荐:

<a href="http://www.php.cn/php-weizijiaocheng-384170.html" target="_self">详解通过刷新PHP缓冲区为你的站点加速</a>          

gzip off;


관련 권장 사항:

🎜🎜🎜🎜🎜<a href="http://www.php.cn/php-weizijiaocheng-384170.html" target="_self">새로고침을 통해 사이트 속도를 높이는 방법에 대한 자세한 설명 PHP 버퍼</a>🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜

위 내용은 PHP에서 출력 버퍼 새로 고침에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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