>  기사  >  백엔드 개발  >  PHP 기본 튜토리얼 PHP 페이지 버퍼링 메커니즘

PHP 기본 튜토리얼 PHP 페이지 버퍼링 메커니즘

巴扎黑
巴扎黑원래의
2016-11-07 11:51:18919검색

PHP에는 여러 가지 메커니즘과 기능이 있습니다. 사실 반복적으로 사용하면 간단한 적용만으로도 마법 같은 효과가 나타납니다. 밴드 오브 브라더스 PHP 교육

여기에 ob_start() 함수가 있습니다.

버퍼를 여는 데는 ob_start() 함수가 사용됩니다. 예를 들어 header() 함수 앞에 캐리지 리턴, 공백, 줄 바꿈 등의 출력이 있으면 "Header"라는 오류가 발생합니다. "에 의해 모든 준비가 완료되었습니다. 이 경우 ob_start()를 사용하여 버퍼를 열 수 있습니다. PHP 코드 및 echo() 출력의 데이터 블록은 버퍼에 들어가고 즉시 출력되지 않습니다. 물론 버퍼를 여는 것은 많은 기능을 사용하려면 다음 네 가지 사항을 요약할 수 있습니다.

1. header() 이전에 사용됨

ob_start() //오픈 버퍼

echo ”Hellon”; //출력

header(”location: index.php”);//브라우저를 index.php로 리디렉션

ob_end_flush();//모든 콘텐츠를 browser

 ?>

 2 .phpinfo() 함수는 클라이언트 및 서버 측 정보를 얻을 수 있지만 클라이언트 측 정보를 저장하려면 버퍼 방식이 최선의 선택입니다

 ob_start(); //버퍼 열기

phpinfo() //phpinfo 함수 사용

$info=ob_get_contents(); $info에 할당

$file=fopen('info.txt','w'); //info.txt 파일 열기

fwrite($file,$info); //info.txt에 정보 쓰기

fclose($file) ; //info.txt 파일 닫기

 ?>

3. 정적 페이지 기술

ob_start();//버퍼 열기

 ?>

 php 페이지 전체 출력

 $content =ob_get_contents();//모든 내용 가져오기 php 페이지 출력

 $fp =fopen("output00001.html", "w") //파일을 만들고 열어서 쓸 준비가 되었습니다.

 fwrite($fp, $content ); //php 페이지의 모든 내용을 output00001.html에 쓴 다음...

 fclose($fp) $code) {

ob_start(); >
eval($code);

$contents =ob_get_contents();

ob_end_clean();

echo " 오류! 출력 없음";

exit();

}

return $contents;

 }

 출력 제어 기능 스크립트의 데이터 출력을 자유롭게 제어할 수 있습니다. 이는 특히 데이터가 출력된 후 파일 헤더를 출력하려는 ​​경우 매우 유용합니다. 출력 제어 기능은 header() 또는 setcookie()를 사용하여 전송된 파일 헤더 정보에는 영향을 미치지 않으며 echo() 및 PHP 코드와 유사한 데이터 블록에만 영향을 미칩니다.

OutputControl에 대한 일반적인 느낌을 주기 위해 간단한 예를 들어 보겠습니다.

예 1.

CODE
ob_start (); //버퍼 열기

echo ”Hellon”; //출력

header(”location:index.php”) //브라우저를 index.php로 리디렉션

ob_end_flush();//모든 내용을 브라우저에 출력

 ?>
header() 함수를 아는 사람이라면 이 함수가 문단을 보낸다는 사실을 알 것이다. 파일 헤더는 그러나 이 기능을 사용하기 전에 출력(공백, 캐리지 리턴, 라인 피드 등 빈 출력 포함)이 있는 경우 오류 메시지가 표시됩니다. 첫 번째 줄에서 ob_start()를 제거하고 이 프로그램을 다시 실행하면 다음과 같은 오류 메시지가 표시됩니다. "Header had all Ready send by" 그러나 ob_start를 사용하면 버퍼가 다음과 같기 때문에 오류 메시지가 없습니다. 영역을 켜면 echo 이후의 문자는 브라우저에 출력되지 않지만 서버에는 플러시 또는 ob_end_flush를 사용할 때까지 출력되지 않으므로 파일 헤더 출력 오류가 발생하지 않습니다.

1. 관련 함수 소개:

1. 플러시: 버퍼의 내용을 새로 고치고 출력합니다.

함수 형식: 플러시()

설명: 이 함수는 자주 사용되며 매우 효율적입니다.

2. ob_start: 출력 버퍼 열기

함수 형식: void ob_start(void)

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

 3.ob_get_contents: 내부 버퍼의 내용을 반환합니다.

사용법: stringob_get_contents(void)

설명: 이 함수는 현재 버퍼의 내용을 반환합니다. 출력 버퍼가 활성화되지 않은 경우 FALSE를 반환합니다.

 4.ob_get_length: 내부 버퍼의 길이를 반환합니다.

사용법: intob_get_length(void)

설명: 이 함수는 출력 버퍼가 활성화되지 않은 경우 ob_get_contents와 동일하게 현재 버퍼의 길이를 반환합니다. 그런 다음 FALSE를 반환합니다.

5. ob_end_flush: 내부 버퍼의 내용을 브라우저로 보내고 출력 버퍼를 닫습니다.

사용법: voidob_end_flush(void)

설명: 이 함수는 출력 버퍼(있는 경우)의 내용을 보냅니다.

6. ob_end_clean: 내부 버퍼의 내용을 삭제하고 내부 버퍼를 닫습니다.

사용 방법: voidob_end_clean(void)

참고: 이 함수는 내부 버퍼를 출력하지 않습니다. 버퍼 영역 내용을 삭제하지만

7. ob_implicit_flush: 절대 새로 고침을 켜거나 끕니다.

사용 방법: void ob_implicit_flush([int flag])

설명: 사용 Perl을 사용해 본 사람이라면 누구나 $|=x의 의미를 알 것입니다. 이 문자열은 버퍼를 열고 닫을 수 있으며, ob_implicit_flush 함수는 그것과 동일합니다. 기본값은 절대 출력을 켠 후 각 스크립트 출력입니다. 브라우저에 직접 전송됩니다. 더 이상 플러시()를 호출할 필요가 없습니다.

2. 심층 이해:

1. Flush 함수 정보:

이 함수는 PHP3에 등장했습니다. 이는 매우 효율적인 기능으로 브라우저 캐시를 새로 고치는 기능이 있습니다.

예제 2.

CODE php
 for($i
  // 이 문장은 매우 중요합니다. 캐시가 콘텐츠를 생성합니다. 특정 크기에 도달해야 브라우저에서 출력할 수 있습니다.

// 즉, 캐시 콘텐츠가 특정 크기에 도달하지 않으면 프로그램 이전에 출력되지 않습니다. 실행됩니다.

테스트 결과 // 이 크기의 하한선이 256자임을 확인했습니다. 이는 앞으로 캐시에 수신된 콘텐츠가 지속적으로 전송된다는 의미입니다.

//

 For($j = 1; $j
 echo $j.”

 “; : 자세히 보세요. 🎜>
PHP2000의 최신 PHP 채팅방에서는 아쉽게도 소스 코드가 공개되지 않습니다.

참고: 프로그램 시작 부분에 ob_implicit_flush()를 추가하면 됩니다. 절대 새로 고침을 켜려면 Flush()가 더 이상 프로그램에서 사용되지 않습니다. 이것의 장점은 효율성 향상입니다!

 2. ob 시리즈 기능에 관해:

먼저 내 좋은 친구 y10k의 예를 인용하고 싶습니다.

예 3.

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

 CODE
ob_start(); / /버퍼 열기

phpinfo() //phpinfo 함수 사용

$info= ob_get_contents(); //버퍼의 내용을 가져와 $info에 할당

$file=fopen('info.txt','w') //info.txt 파일 열기

fwrite($file,$info); //info.txt에 정보 쓰기
 fclose($file) //info.txt 파일 닫기

 ?>

위의 방법을 사용하면 다른 사용자의 phpinfo 정보를 저장할 수 있는데, 이는 아마도 과거에는 불가능했을 것입니다. 사실 위의 방법은 일부 "프로세스"를 변환하는 방법입니다.

누군가가 "이게 바로 이런 건가요? 다른 용도도 있나요?"라고 물을 수도 있습니다. 예를 들어 저자 포럼의 PHP 구문 강조는 이와 관련이 있습니다. (PHP의 기본 구문 강조 기능은 직접 출력하고 결과를 저장할 수 없습니다. 호출할 때마다 표시하면 CPU 낭비가 됩니다. 저자 포럼에는 구문 강조 기능이 추가되어 있습니다. Bright 함수로 표시되는 결과는 다음과 같이 유지됩니다. 버퍼 제어) 관심이 있다면 http://www.zphp.com/bbs/를 살펴보세요!

아마도 이제 ob_start()에 관심이 있을 것입니다. 위의 예는 간단해 보이지만 실제로는 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 시리즈 기능을 이용하여 구현했습니다.

첫 번째 방법에 대해서는 이 글에서 다룰 내용이 아니므로 자세히 다루지는 않겠다.

이제 두 번째 방법의 구체적인 구현을 살펴보겠습니다.

예제 4.

CODE
ob_start();/ /버퍼 열기

 ?>

 php 페이지 전체 출력

   

 $content =ob_get_contents();//php 페이지 출력 가져오기

의 전체 내용 $fp =fopen("output00001.html", "w") //파일을 만들고 열어서 쓸 준비가 되었습니다.

fwrite($fp, $content ); //php 페이지의 내용을 모두 output00001.html에 쓰고...

 fclose($fp)

 ?>

 여기서 방식으로 소위 정적 템플릿을 쉽게 구현할 수 있습니다...

2. 출력 캡처

위의 예제 4.는 작업을 작성하기 전에 $content를 수정할 수도 있는 가장 간단한 경우입니다. ...

예제 3에 설명된 PHP 구문 강조 표시와 같이 일부 키워드를 캡처한 다음 다시 처리할 수 있습니다. 개인적으로 이 기능이 이 기능의 가장 큰 본질이라고 생각합니다. 다양한 문제를 해결할 수 있지만 충분한 상상력이 필요합니다...

 예제 5.

CODE
함수 run_code($code) {

If($code) {

ob_start()

eval($code);
exit();

 }

return $contents;

 }

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

 예제 6 . 전송 속도 향상

CODE

ob_implicit_flush(0) 🎜>
if (headers_sent() ||connection_timeout( ) || 연결_중단됨()){

return 0;

} , 'x-gzip') !== false) return ”x-gzip";

 if (strpos($HTTP_ACCEPT_ENCODING,'gzip') !== false) return ”gzip";  

return 0; if ($ENCODING){

print ”n
n”;

$Contents =ob_get_contents();

ob_end_clean();

if ($debug){

 $s = ”
길이를 압축하지 않음 : ”.strlen($Contents);

 $s .= ”

압축된 길이: ”.strlen(gzcompress($Contents,$level))

$ 내용 .= $s;

인쇄”x1fx8bx08×00x00×00x00×00”

$Size = strlen($Contents); 🎜> $Contents =gzcompress($Contents,$level)

 $Contents = substr($Contents,0, strlen($Contents) – 4)

 print $Contents;

print pack('V',$Crc); 🎜>
print pack('V',$Size);

종료

}else{

ob_end_flush()

;

 }

 }

 ?>

  이것은 weblogs.com에서 본 catoc의 아주 오래된 코드입니다. 테스트 결과 10k 이상의 페이지에서 효과가 나타나는 것으로 나타났으며, 페이지가 클수록 효과가 더욱 뚜렷해졌습니다...

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