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

巴扎黑
풀어 주다: 2016-11-21 09:53:16
원래의
1041명이 탐색했습니다.

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) //정보 쓰기 to info.txt

fclose($file ); //info.txt 파일을 닫습니다

?>

3. 정적 페이지 기술

ob_start();//버퍼 열기

?>

PHP 페이지의 모든 출력

$content =ob_get_contents();//모든 콘텐츠 출력 가져오기 PHP 페이지

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

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

 fclose($fp) 🎜> If($code) {

ob_start( );

eval($code);

$contents =ob_get_contents()

ob_end_clean ()


echo “오류! 출력 없음”;

}

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 = 1; $i <= 300;$i++ ) print(" ");

  // 이 문장은 매우 중요합니다. 만듭니다. 콘텐츠가 일정 크기에 도달해야 브라우저에서 출력할 수 있습니다

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

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

//

 For($j = 1; $j <= 20;$j++) {

 echo $j.”

 “; (); //이렇게 하면 새로 추가된 콘텐츠가 캐시에서 추출되어 브라우저에 표시됩니다.

sleep(1) //프로그램을 1초 동안 "잠자기" 상태로 두세요. php

PHP2000의 최신 PHP 채팅방에서는 아쉽게도 소스코드가 공개되지 않습니다. L

참고: ob_implicit_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) //파일 닫기 .txt

 ?>

위 방법을 사용하면 다른 사용자의 phpinfo 정보를 저장할 수 있습니다. 이전에는 이를 수행할 수 있는 방법이 없었습니다. , 위의 내용은 일부 "프로세스"를 "함수"로 변환하는 방법입니다!

"이게 전부인가요? 다른 용도가 있나요?"라고 묻는 사람도 있을 수 있습니다. 예, 예를 들어 PHP 구문입니다. 작성자 포럼의 하이라이팅도 이와 관련이 있습니다(PHP의 기본 구문하이라이팅 기능은 직접 출력하고 결과를 저장할 수 없습니다. 호출할 때마다 표시하면 CPU 낭비가 됩니다. 작성자 포럼은 다음과 같이 표시되는 결과입니다. 구문 강조 기능은 버퍼를 제어하여 유지됩니다. 관심이 있으시면 http://www.zphp.com/bbs/를 살펴보십시오.

이제 관심이 있으실 것입니다. ob_start()의 기능을 어느 정도 이해하고 있다면 위의 예가 간단해 보일 수도 있지만 사실 우리는 ob_start() 사용의 핵심 사항을 마스터했습니다.

 <1>. 브라우저의 캐시를 열려면 ob_start를 사용하세요. 이렇게 하면 플러시(), ob_end_flush()를 호출하기 전에(또는 프로그램이 실행되기 전에) 캐시의 내용이 출력되지 않습니다.

<2> 이제 여러분은 다음과 같은 장점을 알아야 합니다. 출력 콘텐츠 후에 헤더, setcookie 및 세션을 사용할 수 있으며 이는 ob_start의 매개변수를 사용하여 캐시에 작성할 수도 있습니다. 즉, ob_start("ob_gzhandler ")와 같은 명령이 자동으로 실행되며 가장 일반적으로 사용되는 방법은 ob_get_contents()를 사용하여 캐시의 콘텐츠를 가져온 다음 처리하는 것입니다...

<3>. 처리 후에는 다양한 방법으로 출력, 플러시(), ob_end_flush() 및 프로그램 실행 후 자동 출력을 수행할 수 있습니다. 물론, ob_get_contents()를 사용한다면 출력 방식을 직접 제어해야 합니다.

자, ob 시리즈 기능으로 무엇을 할 수 있는지 볼까요...

1. 정적 템플릿 기술

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

저는 정적 출력을 얻는 두 가지 방법을 알고 있습니다.



 <2>. 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); >
$contents =ob_get_contents();

ob_end_clean();

}else {

echo "오류! 출력 없음"; exit();

 }

return $contents;

 }

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

 예 6. 속도 ​​전송

CODE
ob_start()

ob_implicit_flush(0); global$HTTP_ACCEPT_ENCODING; if (headers_sent() ||connection_timeout() || Connection_aborted()){

return 0; (strpos($HTTP_ACCEPT_ENCODING , 'x-gzip') !== false) return ”x-gzip";

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

0 반환; if ($ENCODING){

인쇄 ”nn”

$Contents =ob_get_contents();

ob_end_clean();

if ($debug){

$s = ”

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

$s .= ”

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

$Contents .= $s

}

헤더(” Content-Encoding:$ENCODING”)

 print”x1fx8bx08×00x00×00x00×00”;$Size = strlen($Contents);

$Crc = crc32($Contents);

$Contents =gzcompress($Contents,$level)

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

$Contents 인쇄

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

종료;

ob_end_flush()

전송된 콘텐츠를 압축하는 기능 테스트 결과 10k 이상의 페이지에 영향을 미치는 것으로 나타났으며, 페이지가 클수록 효과가 더 뚜렷해집니다...

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