PHP의 Output_buffering에 대한 자세한 소개

黄舟
풀어 주다: 2023-03-17 18:36:01
원래의
2254명이 탐색했습니다.

제목을 보고 헷갈려 하시는 분들이 많을 거라 생각하고, Output_buffering이 무엇인지도 모르시는 분들이 많을 거라 생각합니다. 그래서 오늘은 PHP의 Output_buffering에 대해 자세히 소개하겠습니다. 아시다시피 지식 포인트를 통합할 수 있고, 모르면 열심히 공부하면 됩니다!

1. PHP의 캐시가 무엇인지 이야기해 봅시다!

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

PHP에 캐시된 출력 시퀀스는 다음과 같습니다.
열린 PHP 출력 캐시:

echo,print -> php output_buffering -> server buffering -> browser buffering -> browser display
로그인 후 복사

열리지 않은 PHP 출력 캐시:

echo,print -> server buffering -> browser buffering -> browser display
로그인 후 복사

브라우저 출력 캐시: 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.&#39;<br>&#39;; 
 
sleep(1); 
 
}
로그인 후 복사

실행 결과: 데이터가 버퍼 1개로 가득 차지 않기 때문에 모든 스크립트가 완료된 후에만 출력됩니다.

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

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

에서 출력_버퍼링=0 수정 실행 결과: OB가 비활성화되어 있으므로 스크립트가 나올 때까지 기다릴 필요가 없습니다. 실행이 완료되면 데이터가 OB에 남아 있지 않고 간헐적으로 출력되는 것을 볼 수 있습니다. echo ->browser buffering -> 브라우저 표시

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

for($i=0; $i<5; $i++){ 
  echo file_get_contents(&#39;f.txt&#39;).$i.&#39;<br/><br/><br/><br/>&#39;; 
  sleep(2); 
}
로그인 후 복사

작업 결과: f.txt는 4kb보다 큰 파일입니다. , 버퍼의 기본값보다 크고 버퍼 공간이 부족하기 때문에 버퍼가 가득 찰 때마다 출력을 하므로 간헐적으로 출력되는 모습을 볼 수 있습니다.

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

ob_start(); 
for($i=0; $i<5; $i++){ 
  echo file_get_contents(&#39;f.txt&#39;).$i.&#39;<br/><br/><br/><br/>&#39;; 
  sleep(2); 
}
로그인 후 복사

실행 결과: ob_start()를 사용하므로 버퍼에 충분한 공간이 설정되므로 다음 위치에 저장됩니다. 스크립트 실행 완료 후 출력됩니다.

e, output_buffering=On, 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, output_buffering=Off, 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-
로그인 후 복사

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

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

일반적인 방법:

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

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

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 캐시의 내용을 프로그램 캐시에 넣어주세요! 이렇게 하면 응답 헤더 정보가 항상 응답 본문 내용보다 앞에 옵니다!

요약:

output_buffering을 모르는 친구들도 이 글을 공부하면서 이해를 할 수 있을 거라 믿습니다. 당신의 일!

관련 권장 사항:

PHP 출력 캐시 기반의 출력 버퍼링 예제에 대한 자세한 설명

php 출력 버퍼링 캐시 사용법 소개

PHP 기반 출력 캐싱에 대한 심층적인 이해 (출력_버퍼링)

위 내용은 PHP의 Output_buffering에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿