>백엔드 개발 >PHP 튜토리얼 >PHP 출력_버퍼링 캐시 사용 방법 소개

PHP 출력_버퍼링 캐시 사용 방법 소개

jacklove
jacklove원래의
2018-06-09 15:05:581648검색

buffer는 메모리 주소 공간입니다. Linux 시스템의 기본 크기는 일반적으로 4096(4kb)입니다. 주로 속도가 동기화되지 않은 장치 또는 우선 순위가 다른 장치 간의 데이터 전송 영역을 저장하는 데 사용됩니다.

버퍼는 프로세스 간 대기 시간을 줄일 수 있습니다.

예를 들어 텍스트 편집기를 열고 문자를 입력하면 시스템이 해당 내용을 즉시 디스크에 쓰지 않습니다. 대신 버퍼에 저장됩니다. 버퍼가 가득 차면 버퍼의 내용이 디스크에 기록됩니다.

물론 플러시를 사용하여 버퍼 데이터를 강제로 디스크에 쓸 수도 있습니다.

echo, print 등의 PHP에서는 출력이 tcp를 통해 브라우저 출력으로 즉시 전달되지 않습니다. 대신 데이터가 PHP 버퍼에 기록됩니다. PHP 버퍼가 가득 차면 tcp를 통해 브라우저에 전달됩니다.

echo /print -> php output_buffer -> browser

php output_buffering

기본값은 4096(4kb)입니다. ) . Output_buffering 구성은 php.ini에서 찾을 수 있습니다. 버퍼가 가득 찰 때까지 브라우저로 전송되지 않습니다.

또한 ob_start()를 설정하면 기본값(4kb)을 초과하더라도 즉시 브라우저에 전송되지 않고 스크립트가 완료되거나 종료될 때까지만 브라우저에 출력됩니다. ob_end_flush 메소드가 호출됩니다.

1.output_buffering=4096, 더 적은 데이터 출력(1버퍼 미만)

<?php
for($i=0; $i<10; $i++){
    echo $i.&#39;<br>&#39;;
    sleep(2);
}
?>

작업 결과: 데이터가 한 버퍼의 크기를 꽉 채우지 않기 때문에 모든 스크립트가 완료될 때까지 기다렸다가 출력합니다. .


2.output_buffering=4096, 더 적은 데이터 출력(버퍼 1개 미만), output_buffering 끄기, php.ini

<?php
for($i=0; $i<10; $i++){
    echo $i.str_repeat(" ",500).&#39;<br>&#39;; // 当接受到的256(甚至更多)个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。
    flush();
    sleep(1);
}
?>

에서 output_buffering=0 수정: php 버퍼링이 비활성화되었기 때문에 거기에 출력되기 전에 스크립트 실행이 완료될 때까지 기다릴 필요가 없으며 데이터가 PHP 버퍼에 유지되지 않으며 간헐적인 출력을 볼 수 있습니다. echo ->tcp buffer ->browser

3.output_buffering=4096일 때, 더 큰 데이터(버퍼 1개보다 큼)를 출력하고, ob_start()

<?php
for($i=0; $i<10; $i++){
    echo file_get_contents(&#39;f.txt&#39;).$i.&#39;<br>&#39;;
    sleep(1);
}
?>

를 사용하지 마세요. txt 4kb보다 큰 파일입니다. 기본 버퍼 값보다 크고 버퍼 공간이 부족하기 때문에 버퍼가 가득 찰 때마다 출력되므로 간헐적으로 출력되는 것을 볼 수 있습니다.

4.output_buffering=4096일 경우 더 큰 데이터(버퍼 1개 이상)를 출력하려면 ob_start()를 사용하세요.

<?php
ob_start();
for($i=0; $i<10; $i++){
    echo file_get_contents(&#39;f.txt&#39;).$i.&#39;<br>&#39;;
    sleep(1);
}
?>

작업 결과: ob_start()를 사용하므로 충분히 큰 크기가 설정됩니다. 버퍼 공간용이므로 스크립트가 실행된 후 출력될 때까지 저장됩니다.

output_buffering 방법

1.ob_start이 활성화되면 스크립트는 더 이상 브라우저에 직접 출력되지 않지만 일시적으로 PHP 버퍼링 영역에 씁니다. 스크립트 실행이 완료될 때까지 전송되지 않습니다.

2.ob_get_contentsPHP 버퍼링에서 데이터를 가져옵니다. 참고: ob_end_clean() 전에 호출해야 합니다. 그렇지 않으면 null 문자만 얻게 됩니다.

3.ob_end_flush 및 ob_end_cleanob_end_flush는 PHP 버퍼링으로 데이터를 출력하지만 지우지는 않습니다.
ob_end_clean은 출력되지 않으며 PHP 버퍼링의 데이터만 삭제됩니다.

참고: 매뉴얼에 설명된
ob_flush/flush는 출력 버퍼를 새로 고치는 동시에 함께 사용해야 하므로 많은 사람들에게 혼동을 줄 수 있습니다...
사실 둘은 서로 다른 개체에서 작동합니다. . 어떤 경우에는 플러시가 전혀 작동하지 않습니다. ob_* 함수는 PHP 자체의 출력 버퍼를 작동합니다. 그래서 ob_flush는 PHP 자체의 버퍼를 새로 고칩니다. PHP가 Apache 모듈(핸들러 또는 필터)로 설치된 경우에만 실제 효과가 있습니다. WebServer의 버퍼를 새로 고칩니다(특히 Apache를 참조하는 것으로 간주될 수 있음). Apache 모듈의 sapi에서 플러시는 sapi_module을 호출합니다. 플러시 멤버 함수 포인터는 Apache의 API를 간접적으로 호출합니다. ap_rflush는 Apache의 출력 버퍼를 새로 고칩니다. 물론 설명서에는 이 작업의 결과를 변경할 수 있는 다른 Apache 모듈도 있다고 나와 있습니다...일부 Apache 모듈 예를 들어, mod_gzip은 자체적으로 출력 캐싱을 수행할 수 있으며, 이로 인해 플러시() 함수에 의해 생성된 결과가 즉시 클라이언트 브라우저로 전송되지 않습니다. 브라우저에서도 수신된 콘텐츠를 표시하기 전에 캐시합니다. 예를 들어, Netscape 브라우저는 개행 문자나 html 태그의 시작 부분을 받을 때까지 콘텐츠를 캐시하고 f16b1740fad44fb09bfe928bcc527e08 태그를 받을 때까지 전체 테이블을 표시하지 않습니다. 일부 버전의 Microsoft Internet Explorer는 256바이트를 수신한 후에만 페이지 표시를 시작하므로 이러한 브라우저가 페이지 콘텐츠를 표시할 수 있도록 일부 추가 공간을 보내야 합니다. 그러므로 둘을 사용하는 올바른 순서는 입니다. Ob_flush를 먼저 수행한 다음 플러시합니다.
물론, 다른 SAPI에서는 Flush를 호출하지 않아도 괜찮습니다. 하지만 코드의 이식성을 보장하기 위해서는 함께 사용하는 것이 좋습니다.

이 글에서는 php 출력_버퍼링 캐시 사용법을 설명합니다. 더 많은 관련 내용은 php 중국어 홈페이지를 참고해주세요.

관련 권장 사항:

php를 통해 BigPipe 청크 출력을 구현하는 방법


fsockopen GET/POST를 사용하여 php를 통해 양식을 제출하고 파일을 업로드하는 방법


소개 php 필터링 html 태그 속성 class

관련 내용

위 내용은 PHP 출력_버퍼링 캐시 사용 방법 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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