>  기사  >  백엔드 개발  >  PHP의 output_buffering_php 기술에 대한 간략한 토론

PHP의 output_buffering_php 기술에 대한 간략한 토론

WBOY
WBOY원래의
2016-05-16 20:11:001341검색

1. php에서 캐시란 무엇인지 알아보겠습니다!

PHP에서는 캐시를 크게 클라이언트 캐시(브라우저 캐시)와 서버 캐시(서버 캐시)로 나눌 수 있습니다. PHP는 B/S 아키텍처를 기반으로 하기 때문에 브라우저 측 캐시와 서버 측 캐시로 이해할 수 있습니다.
서버 측에서 PHP와 함께 제공되는 캐시에서는 크게 두 가지 캐시 유형으로 나눌 수 있습니다! 프로그램 캐시와 OB 캐시! 이는 서버사이드 캐싱 연구의 주요 내용이기도 합니다!

PHP의 캐시된 출력 순서는 다음과 같습니다.
PHP 출력 버퍼링이 켜져 있습니다: echo,print -> 서버 버퍼링 ->

PHP 출력 캐싱이 켜져 있지 않습니다: echo,print -> 서버 버퍼링 ->

브라우저 출력 캐시: IE의 경우 256바이트, Chrome 및 FireFox의 경우 1000바이트. 출력 데이터가 이 길이에 도달하거나 스크립트가 종료되는 경우에만 브라우저가 페이지에 데이터를 출력합니다.

2. 서버 측 응답 프로세스

A. 클라이언트가 서버에 요청 응답을 보냅니다!

B. Apache 서버는 PHP 모듈을 로드하고 해당 프로세스(또는 스레드)를 시작하고 해당 PHP 스크립트 페이지를 실행합니다!

C. OB 캐시가 켜지지 않으면 모든 실행 결과가 프로그램 캐시에 배치된 후 패키징되어 브라우저로 전송됩니다! 브라우저는 페이지를 렌더링하고 우리가 마지막으로 본 웹 페이지를 생성합니다!
D. OB 캐시가 켜지면 실행 결과가 각각 OB 캐시와 프로그램 캐시에 저장됩니다. 프로그램이 마지막 라인까지 실행되면 OB 캐시의 데이터가 프로그램 캐시로 다시 플러시됩니다. , 그리고 이를 패키지화하여 브라우저로 반환합니다! 브라우저는 페이지를 렌더링하고 우리가 보는 웹 페이지를 생성합니다!

3. OB 캐시의 일반적인 용도!

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

for($i=0; $i<5; $i++){ 
 
echo $i.'<br>'; 
 
sleep(1); 
 
}
실행 결과: 하나의 버퍼 크기만큼 데이터가 가득 차지 않기 때문에 모든 스크립트가 실행된 후에만 출력됩니다.

b, 출력_버퍼링=4096, 더 적은 데이터 출력(버퍼 1개 미만), 출력_버퍼링 끄기, php.ini에서 출력_버퍼링=0 수정

echo str_repeat(" ",1024);//这里重复输出一个空白
for($i=0; $i<5; $i++){ 
echo $i."<br/>";
  flush(); 
  sleep(1); 
}

실행 결과: OB가 비활성화되어 있으므로 스크립트가 실행될 때까지 기다릴 필요가 없으며 데이터가 OB에 남아 있지 않으며 간헐적으로 출력되는 것을 볼 수 있습니다. 에코 ->브라우저 버퍼링 -> 브라우저 표시

c, 출력_버퍼링=4096, 더 큰 데이터 출력(버퍼 1개보다 큼), ob_start()를 사용하지 마세요

for($i=0; $i<5; $i++){ 
  echo file_get_contents('f.txt').$i.'<br/><br/><br/><br/>'; 
  sleep(2); 
}

실행 결과: f.txt는 4kb보다 큰 파일입니다. 버퍼의 기본값보다 크기 때문에 버퍼 공간이 부족하므로 버퍼가 가득 찰 때마다 출력되는 것을 확인할 수 있습니다. 간헐적인 출력.

d, 출력_버퍼링=4096, 더 큰 데이터 출력(버퍼 1개보다 큼), ob_start() 사용

ob_start(); 
for($i=0; $i<5; $i++){ 
  echo file_get_contents('f.txt').$i.'<br/><br/><br/><br/>'; 
  sleep(2); 
}

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

e, 출력_버퍼링=켜기, ob_start() 사용

ob_start();
echo "abc-";
header("content-type:text/html;charset=utf-8");
echo "hello-";
ob_end_flush();
echo "aa-";
echo ob_get_contents();

실행 결과: abc-hello-aa-abc-hello-aa-

f, 출력_버퍼링=끄기, ob_start() 사용

실행 결과: abc-hello-aa-

출력 버퍼는 스택 가능합니다. 즉, 하나의 ob_start()가 활성화되어 있는 동안 다른 ob_start()를 호출할 수 있습니다. ob_end_flush()를 올바른 횟수만큼 호출했는지 확인하세요. 여러 출력 콜백이 활성화된 경우 출력은 항상 중첩된 순서로 필터링됩니다.

참고: PHP5.2에서는 OB가 기본적으로 꺼져 있고, 5.3 이후에는 기본적으로 켜져 있습니다.

일반적인 방법:

1.ob_start
출력 버퍼링 메커니즘을 활성화하면 스크립트가 더 이상 브라우저에 직접 출력되지 않고 일시적으로 PHP 버퍼링 영역에 기록됩니다. 스크립트 실행이 완료될 때까지 전송되지 않습니다.

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

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

4.ob_flush, 플러시, ob_implicit_flush
ob_flush는 프로그램 캐시에 대한 PHP 버퍼링의 데이터를 새로 고칩니다.

flush는 프로그램 캐시를 브라우저 캐시로 새로 고칩니다.

ob_implicit_flush는 절대(암시적) 플러시를 켜거나 끕니다. 절대(암시적) 플러시는 각 출력 호출 후에 플러시 작업을 수행하므로 플러시()에 대한 명시적 호출이 더 이상 필요하지 않습니다.

4. OB 캐시의 역할!

OB 캐시는 다양한 측면에서 활용되는데 제가 알고 있는 내용은 크게 두 가지 측면입니다!
a. 웹사이트를 정적화하려는 경우 OB 캐시를 선택하는 것이 좋습니다!

b. 오류 해결 경고: 헤더 정보를 수정할 수 없습니다. 헤더가 이미 전송되었습니다!
오류의 원인은 응답 헤더와 해당 본문이 잘못 정렬되었기 때문입니다. 정상적인 상황에서 서버가 브라우저에 반환하는 해당 콘텐츠는 다음과 같아야 합니다. 응답 헤더 응답 본문!

그러나 OB 캐시를 활성화하면 해당 헤더 정보(일반적으로 header() 함수에 의해 설정된 정보)가 프로그램 캐시에 저장됩니다!
echo print_r var_dump 등과 같은 기타 출력 콘텐츠가 먼저 OB 캐시에 저장됩니다!
프로그램이 종료되거나 OB 캐시가 닫히면 OB 캐시의 내용을 프로그램 캐시에 넣으세요! 이렇게 하면 응답 헤더 정보가 항상 응답 본문 내용보다 앞에 옵니다!

위 내용은 이 글의 전체 내용입니다. 모두 마음에 드셨으면 좋겠습니다.

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