> 백엔드 개발 > PHP 튜토리얼 > PHP 함수 ob_start()가 브라우저 캐시를 제어하는 ​​방법에 대한 자세한 설명

PHP 함수 ob_start()가 브라우저 캐시를 제어하는 ​​방법에 대한 자세한 설명

WBOY
풀어 주다: 2016-07-25 08:57:30
원래의
1137명이 탐색했습니다.
  1. ob_start(); //오픈 버퍼
  2. echo "Hellon"; //출력
  3. header("위치: index .php"); //브라우저를 index.php로 리디렉션
  4. ob_end_flush();//모든 콘텐츠를 브라우저에 출력
  5. //by bbs.it-home.org
  6. ?> ;
코드 복사

여기서는 php의 헤더 기능을 사용하는데, 이 기능을 사용하면 브라우저에 파일 헤더가 전달됩니다. 이전의 모든 출력(공백, 캐리지 리턴 및 줄 바꿈과 같은 빈 출력 포함)에는 오류 메시지가 표시됩니다. 첫 번째 줄에서 ob_start()를 제거하고 이 프로그램을 실행하면 다음과 같은 오류 메시지가 표시됩니다: "Header had all Ready send by"! ob_start를 추가하면 오류가 발생하지 않습니다. 그 이유는 버퍼가 열릴 때 echo 뒤의 문자가 브라우저에 출력되지 않지만 플러시 또는 ob_end_flush를 사용할 때까지 서버에 유지되기 때문입니다. 그러면 파일 헤더 출력 오류가 발생하지 않습니다!

오늘의 주제를 시작해 보겠습니다. ob_start()를 사용하여 브라우저의 캐시를 제어하세요.

1. 관련 기능 소개: 1. 플러시: 버퍼 및 출력의 내용을 새로 고칩니다. 함수 형식: 플러시() 설명: 이 기능은 자주 사용되며 매우 효율적입니다.

2. ob_start: 출력 버퍼를 엽니다. 함수 형식: void ob_start(void) 참고: 버퍼가 활성화되면 PHP 프로그램의 파일이 아닌 모든 헤더 정보는 전송되지 않고 내부 버퍼에 저장됩니다. 버퍼의 내용을 출력하려면 ob_end_flush() 또는 플러시()를 사용하여 버퍼의 내용을 출력할 수 있습니다.

3. ob_get_contents: 내부 버퍼의 내용을 반환합니다. 사용법: 문자열 ob_get_contents(void) 설명: 이 함수는 현재 버퍼의 내용을 반환합니다. 출력 버퍼가 활성화되지 않은 경우 FALSE를 반환합니다.

4. ob_get_length: 내부 버퍼의 길이를 반환합니다. 사용법: int ob_get_length(void) 설명: 이 함수는 출력 버퍼가 활성화되지 않은 경우 ob_get_contents와 같이 현재 버퍼의 길이를 반환합니다. 그런 다음 FALSE를 반환합니다.

5. ob_end_flush: 내부 버퍼의 내용을 브라우저로 보내고 출력 버퍼를 닫습니다. 사용법: void ob_end_flush(void) 설명: 이 함수는 출력 버퍼(있는 경우)의 내용을 보냅니다.

6. ob_end_clean: 내부 버퍼의 내용을 삭제하고 내부 버퍼를 닫습니다. 사용법: void ob_end_clean(void) 설명: 이 기능은 내부 버퍼의 내용을 출력하지 않고 삭제합니다!

7. ob_implicit_flush: 절대 새로 고침을 켜거나 끕니다. 사용법: void ob_implicit_flush ([int 플래그]) 참고: Perl을 사용해 본 사람이라면 누구나 $|=x의 의미를 알 것입니다. 이 문자열은 버퍼를 열고 닫을 수 있으며, ob_implicit_flush 함수는 그것과 동일합니다. 기본값은 절대 출력을 켠 후 각. 스크립트 출력 브라우저에 직접 보내기, 플러시()를 호출할 필요 없음

2. 심층적인 이해: 1. 플러시 기능 정보: 브라우저의 캐시를 새로 고치는 데 사용됩니다.

예:

  1. for($i = 1; $i <= 300; $i ) print(" ");
  2. // 핵심문, 캐시의 구조는 그 내용이 특정 크기에 도달해야만 브라우저에서 출력할 수 있도록 되어 있습니다
  3. // 즉, 캐시의 내용이 특정 크기에 도달하지 못하는 경우 , 프로그램이 실행되기 전에는 출력되지 않습니다.
  4. // 테스트 결과 이 ​​크기의 하한이 256자임을 확인했습니다. 이는 앞으로 캐시에 수신된 콘텐츠가
  5. // 지속적으로 전송된다는 의미입니다.
  6. For($j = 1; $j <= 20; $j ) {
  7. echo $j."
  8. ";
  9. flush() //이렇게 하면 캐시에 새 항목이 추가됩니다. 콘텐츠가 압축되어 브라우저에 표시됩니다
  10. sleep(1); //프로그램을 잠시 "잠자기" 상태로 두면 효과를 더 명확하게 확인할 수 있습니다
  11. }
  12. ?>
코드 복사

참고: 절대 플러시를 켜기 위해 프로그램 시작 부분에 ob_implicit_flush()를 추가하면 더 이상 플러시()를 사용할 수 없습니다. ) 프로그램에서.

2. ob 시리즈 기능 정보: 예를 들어 서버와 클라이언트의 설정 정보를 사용할 수 있는데, 클라이언트에 따라 이 정보가 다를 수 있습니다. phpinfo() 함수의 출력을 저장하고 싶다면 어떻게 해야 할까요? 버퍼 제어가 없었기 전에는 전혀 해결책이 없었다고 할 수 있지만, 버퍼 제어를 사용하면 쉽게 해결할 수 있습니다. 예:

  1. ob_start(); //오픈 버퍼
  2. phpinfo() //phpinfo 함수 사용
  3. $ info =ob_get_contents(); //버퍼의 내용을 가져와 $info에 할당
  4. $file=fopen('info.txt','w') //info.txt 파일 열기
  5. fwrite ($ file,$info); //info.txt에 정보 쓰기
  6. fclose($file); //info.txt 파일을 닫습니다
  7. //by bbs.it-home.org
  8. ? >
코드 복사

위 방법을 사용하면 다른 사용자의 phpinfo 정보를 저장할 수 있습니다. 이전에는 불가능했을 수도 있습니다! 사실 위의 내용은 일부 "프로세스"를 "기능"으로 변환하는 방법입니다! PHP의 기본 구문 강조 기능은 직접 출력되며 결과를 호출할 때마다 표시하면 CPU가 낭비됩니다.

ob_start()의 주요 내용입니다. . ob_start를 사용하여 브라우저의 캐시를 엽니다. 이렇게 하면 플러시(), ob_end_flush()를 호출하기 전에(또는 프로그램이 실행되기 전에) 캐시의 내용이 출력되지 않습니다. 이제 장점을 알아야 합니다. 출력 콘텐츠 후에 헤더, setcookie 및 세션을 사용할 수 있습니다. 이는 ob_start의 뛰어난 기능이며 캐시가 작성된 후에도 ob_start의 매개변수를 사용할 수 있습니다. 그런 다음 ob_start("ob_gzhandler")와 같은 명령을 자동으로 실행합니다. 가장 일반적인 접근 방식은 ob_get_contents()를 사용하여 캐시 내용을 가져온 다음 처리하는 것입니다. 처리가 완료되면 다양한 방법으로 출력, 플러시(), ob_end_flush() 및 프로그램 실행 완료 후 자동 출력을 수행할 수 있습니다. 물론, ob_get_contents()를 사용한다면 출력 방식을 직접 제어해야 합니다.

Ob시리즈 기능 사용법을 알아볼까요?

1. 정적 템플릿 기술 소개: 소위 정적 템플릿 기술은 특정 방법을 사용하여 사용자가 클라이언트 측에서 PHP가 생성한 HTML 페이지를 가져올 수 있도록 합니다. 이 HTML 페이지가 더 이상 업데이트되지 않으면 다른 사용자가 이 페이지를 다시 탐색할 때 프로그램은 sina, 163, sohu와 같이 많은 양의 정보가 있는 일부 웹 사이트의 경우 더 이상 PHP 및 관련 데이터베이스를 호출하지 않습니다. 이와 같은 기술의 이점은 엄청납니다.

정적 출력을 얻는 방법에는 두 가지가 있습니다. y10k로 수정된 phplib의 template.inc.php라는 클래스를 통해 구현되었습니다. ob 시리즈 기능을 사용해 구현해보세요. 첫 번째 방법에 대해서는 본 글에서 다룰 내용이 아니므로 자세한 내용은 다루지 않겠다. 이제 두 번째 방법의 구체적인 구현을 살펴보겠습니다. 예:

  1. ob_start();//버퍼 열기
  2. ?>
코드 복사

PHP 페이지의 전체 출력:

  1. $content = ob_get_contents();//php 페이지에서 출력되는 모든 콘텐츠 가져오기
  2. $fp = fopen( "output00001 .html", "w"); //파일을 만들고 열고 쓰기 준비
  3. fwrite($fp, $content) //php 페이지의 모든 내용을 output00001.html에 씁니다. , 그리고...
  4. fclose($fp);
  5. //by bbs.it-home.org
  6. ?>
코드 복사

2. 캡쳐 출력 위의 예는 작성하기 전에 $content에 대해 작업을 수행할 수도 있는 가장 간단한 경우입니다. 일부 키워드를 캡처한 다음 PHP 구문 강조 표시와 같이 다시 처리할 수 있습니다. 예시 5:

  1. 함수 run_code($code) {
  2. If($code) {
  3. ob_start();
  4. eval($code);
  5. $contents = ob_get_contents();
  6. ob_end_clean();
  7. }else {
  8. echo "오류! 출력 없음";
  9. exit();
  10. }
  11. return $contents;
  12. }
코드 복사

위의 예는 그다지 유용하지는 않지만 $code 자체가 변수를 포함하는 출력 페이지인 것이 일반적입니다. 이 예에서는 eval을 사용하여 $code의 변수를 대체한 다음 출력 결과를 캡처한 다음 한번에 처리하세요...

예 6, 전송 속도 높이기

  1. ** ------------파일 시작-- --------

  2. ** |** | include('gzdoc.php');
  3. ** |? >
  4. ** |** |... 페이지 ...
  5. ** |
  6. ** |** gzdocout();
  7. ** |? >
  8. ** -------------파일 끝----------
  9. */

  10. < ; p>ob_start();
  11. ob_implicit_flush(0);
  12. function CheckCanGzip(){
  13. global $HTTP_ACCEPT_ENCODING;
  14. if (headers_sent() || 연결_시간 초과() || 연결_aborted()){
  15. return 0;
  16. }

  17. if (strpos($HTTP_ACCEPT_ENCODING, 'x-gzip') !== false) return "x-gzip";

  18. if (strpos($HTTP_ACCEPT_ENCODING,'gzip') !== false) return "gzip";
  19. return 0;
  20. }

  21. /* $level = 압축 수준 0 -9, 0=없음, 9=최대 */

  22. function GzDocOut($level=1,$debug=0){
  23. $ENCODING = CheckCanGzip();
  24. if ($ENCODING){
  25. print "nn 사용";
  26. $Contents = ob_get_contents();
  27. ob_end_clean();
  28. if ($debug){
  29. $ s = "

    압축되지 않은 길이: ".strlen($Contents);

  30. $s .= "
  31. 압축된 길이: ".strlen(gzcompress($Contents,$level));
  32. $ Contents .= $s;
  33. }

  34. header("Content-Encoding: $ENCODING");

  35. print "x1fx8bx08x00x00x00x00x00";
  36. $Size = strlen( $Contents);
  37. $Crc = crc32($Contents);
  38. $Contents = gzcompress($Contents,$level);
  39. $Contents = substr($Contents, 0, strlen($Contents) - 4);
  40. $Contents 인쇄;
  41. 팩 인쇄('V',$Crc);
  42. 팩 인쇄('V',$Size);
  43. exit;
  44. }else{
  45. ob_end_flush();
  46. exit;
  47. }
  48. }
  49. ?>
코드 복사

zlib 기능을 사용하면 전송되는 내용이 압축됩니다. 테스트 결과 10k 이상의 페이지에서 효과가 생성되는 것으로 나타났으며, 페이지가 클수록 효과가 더욱 뚜렷해졌습니다.

이것은 PHP의 ob_start 및 기타 관련 캐시 기능의 사용법에 대한 소개입니다. 모든 사람에게 도움이 되기를 바랍니다.



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