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 이상의 페이지에 영향을 미치는 것으로 나타났으며, 페이지가 클수록 효과가 더 뚜렷해집니다...