>  기사  >  백엔드 개발  >  PHP 출력 캐싱의 매력

PHP 출력 캐싱의 매력

巴扎黑
巴扎黑원래의
2016-11-12 09:59:041289검색

PHP 출력 캐시의 매력


1: 출력 캐시 소개

PHP에서 소위 출력 캐시라고 불리는 것은 코드에서 에코 또는 기타 출력 명령이 먼저 실행됩니다. PHP 버퍼에 씁니다. 스크립트가 실행되거나 출력 캐시 명령이 강제로 실행된 후에만 데이터가 브라우저에 출력됩니다. (php 버퍼는 php.ini에 설정된 출력_버퍼링입니다. 기본값은 무제한을 나타내는 on입니다. 크기를 제한하려면 숫자로 대체할 수 있습니다.

예:

echo 'hlmblog.com';
echo 'Technology';
echo 'Share'


이 두 가지는 It을 나타냅니다. 버퍼에 순서대로 삽입되며, 스크립트 실행이 완료되거나 캐시 출력이 강제된 후에만 데이터가 브라우저에 출력됩니다.
에코 데이터를 실시간으로 출력하고 싶다면 아래 코드를 참고하세요


에코 데이터를 실시간으로 출력하고 싶다면 아래 코드를 참고하세요

ob_end_flush (); //아래 설명대로 PHP 캐시를 끄거나, 플러시() 전에 ob_flush()를 실행합니다.
echo str_pad(" ", 256) for ($i=5; $i>0 ; $i--) {
echo $i. '
'
sleep(1)
} 참고:
참고:

1: 플러시와 ob_flush의 차이점:
얼핏 보면 둘은 매우 유사하며, 많은 매뉴얼의 설명이 명확하지 않아 실제로는 모호한 부분이 있습니다. 둘 사이의 큰 차이.
php.ini가 php 버퍼 캐시를 활성화하지 않으면 php 스크립트에서 출력되는 콘텐츠는 서버측에서 출력을 기다리는 상태가 되며 캐시가 켜지지 않기 때문에 출력 캐시에 저장되지 않습니다. 이때, 출력 대기 중인 콘텐츠를 저장하기 위해 플러시를 사용할 수 있습니다. 콘텐츠는 즉시 출력되어 클라이언트(브라우저 또는 기타 출력 터미널)로 전송됩니다.
php.ini가 PHP 버퍼 캐시를 활성화할 때 PHP 스크립트 출력 콘텐츠의 첫 번째 단계는 이를 출력 캐시에 저장하는 것입니다. 이때 플러시를 사용해도 아무런 효과가 없습니다. 및 데이터를 얻을 수 없습니다. 따라서 먼저 ob_flush를 사용하여 출력 캐시에서 콘텐츠를 꺼내어 출력을 기다리는 상태로 만든 다음, 플러시를 사용하여 해당 콘텐츠를 클라이언트로 보내야 합니다. 실행 순서는 먼저 ob_flush를 수행한 다음 플러시하는 것입니다.
따라서 실시간 출력을 얻으려면 ob_end_flush를 사용하여 PHP 출력 캐시를 끈 다음 직접 플러시하거나, 먼저 ob_flush를 사용한 다음 플러시하세요.
2: 브라우저에서 실시간 데이터를 출력할 수 없습니다
코드를 다음 코드로 변경합니다. Chrome, Firefox, IE 및 기타 브라우저에서는 한꺼번에 출력됩니다.

ob_end_flush() ; //플러시 전에 ob_flush()를 끄거나
echo str_pad(" ", 256); i--) {
echo $i;
flash();
sleep(1)>}

오랜 시간 동안 버그를 찾다가 마침내 발견했습니다. 그런데 html 태그만 추가하면 실시간으로 출력할 수 있습니다.
이유는 html 태그를 만났을 때만 즉시 출력되기 때문입니다. 다행히도 출력 내용에는 일반적으로 html 태그가 있고 일반 텍스트는 거의 없습니다.
해결책: 캐리지 리턴이나 기타 HTML 태그를 추가하여 문제를 해결하세요.
2: 어떤 캐시 출력을 사용할 수 있는지 제어, 몇 가지 구체적인 예
1: 정적 페이지 생성
정적 페이지의 로딩 속도가 빠릅니다. 이 문장은 잘 알려진 사실이므로 How가 필요하지 않습니다. 데이터베이스를 요청하는 것이 좋습니다.
다음은 정적 페이지 생성의 예입니다.

echo str_pad('', 1024);//버퍼 오버플로
ob_start();//버퍼 열기
$ content = ob_get_contents();//페이지의 콘텐츠 출력 가져오기
$f = fopen('./index.html', 'w')
fwrite($f, $content);// txt 파일에 내용을 씁니다.
fclose($f);
ob_end_clean();//버퍼를 지우고 닫습니다.

전설적인 정적 페이지는 이렇게 간단히 생성됩니다.
2: 출력 캡처

function test($param) {
if($param) {
ob_start()
eval($param)
$contents = ob_get_contents();
ob_end_clean();
}else {
echo '안타깝게도 출력이 없습니다.'
}
return $contents;

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