PHP 출력 버퍼 제어(출력 제어)상세 설명

php 버퍼 안내
      사실 저 는 phop ob 시리즈 에 대한 인상 이 모호 합 니 다.구체 적 으로 어떻게 놀 았 는 지 잘 모 르 겠 습 니 다.평소에 curd 는 이런 내용 에 대해 깊이 있 지 않 습 니 다.페 퍼 로 서 부 끄 럽 습 니 다.인터넷 에서 검색 한 결과 서로 copy,코드 운행 에 작가 가 묘사 한 현상 이 나타 나 면 안 되 고 본 고 는 양심 적 으로 제품 을 만 들 었 으 며 코드 는 모두 작가 가 운행 한 것 이다.
 출력 을 실행 할 때,예 를 들 어 echo,print.출력 은 웹 서버 에 즉시 보 내지 않 고 php buffer 에 데 이 터 를 기록 합 니 다.php output_buffering 메커니즘 의 장점 은 당연히 성능 을 향상 시킨다.사실 php 파일 은 최종 적 으로 브 라 우 저 에 표 시 됩 니 다.3 개의 버퍼 단 계 를 거 쳤 습 니 다:php buffer=웹 server buffer=browser buffer.마지막 으로 브 라 우 저 보이 기
기본적으로 php buffer 는 열 려 있 고 이 buffer 의 기본 값 은 4096,즉 4kb 입 니 다.php.ini 프로필 에서 output 를 찾 을 수 있 습 니 다.buffering 설정.buffer 는 메모리 주소 공간 입 니 다.Linux 시스템 의 기본 크기 는 보통 4096(4kb),즉 메모리 페이지 입 니 다.주로 저장 속도 가 동기 화 되 지 않 는 장치 나 우선 순위 가 다른 장치 간 에 데 이 터 를 전송 하 는 구역 에 사용 된다.buffer 를 통 해 프로 세 스 간 의 상호 기다 림 을 줄 일 수 있 습 니 다.여기 서 통속 적 인 예 를 들 어 텍스트 편집 기 를 열 어 파일 을 편집 할 때 한 문 자 를 입력 할 때마다 운영 체 제 는 이 문 자 를 디스크 에 직접 쓰 지 않 고 buffer 에 먼저 기록 합 니 다.buffer 에 가득 쓸 때 만 buffer 의 데 이 터 를 디스크 에 기록 합 니 다.물론 커 널 함수 flush()를 호출 할 때.버퍼 의 더러 운 데 이 터 를 디스크 에 다시 쓰 도록 강제 합 니 다.
  예 를 들다

<?php
echo "      <br>";
header("content-type:text/html;charset='utf-8'");
echo "    !";
//output
//      
//    
header()는 실제 출력 전에 호출 해 야 하지만 프로그램 은 출력 되 었 지만 정상적으로 작 동 합 니 다.아래 코드 를 보고 있 습 니 다:

<?phpecho "      <br>";
ob_flush();
header("content-type:text/html;charset='utf-8'");
echo "    !";
//output
//      
//Cannot modify header information - headers already sent by (output started at E:\php\test.php:3)
//    
위의 프로그램 은 프로그램 이 즉시 출력 되 지 않 고 ob 를 호출 할 때 설명 합 니 다.flush 함수 일 때 만 버퍼,출력 을 새로 고 칩 니 다.
  ob_flush()와 flush()
ob_flush(),flush()함수 phop 매 뉴 얼 에 상세 한 설명 이 있 으 니 찾 아 보 세 요.양자 의 차 이 는:
ob_flush()는 PHP 자체 버퍼 새로 고침
flush()는 웹 서버 서버 를 새로 고 치 는 버퍼 입 니 다.브 라 우 저 로 출력 합 니 다.하지만 다음 과 같은 상황 이 발생 할 수 있다.
  • 개별 웹 서버 프로그램,특히 Win 32 의 웹 서버 프로그램 은 결 과 를 브 라 우 저 로 보 내기 전에 프로그램 이 끝 날 때 까지 스 크 립 트 의 출력 을 캐 시 합 니 다.
  • mod 와 같은 아파 치 모듈 이 있 습 니 다.gzip,출력 캐 시 를 직접 진행 할 수 있 습 니 다.이 로 인해 flush()함수 가 발생 하 는 결 과 는 클 라 이언 트 브 라 우 저 에 바로 전송 되 지 않 습 니 다.
  • 심지어 브 라 우 저 도 표시 하기 전에 캐 시 에서 받 은 내용 을 표시 합 니 다.예 를 들 어 넷 스 케 이 프 브 라 우 저 는 줄 바 꿈 이나 html 태그 의 시작 을 받 아들 이기 전에 내용 을 캐 시 하고표 시 를 받 아들 이기 전에 표 전 체 를 표시 하지 않 습 니 다.
  • 일부 버 전의 Microsoft Internet Explorer 는 256 개의 바이트 가 받 아들 여진 후에 야 이 페이지 를 표시 하기 시 작 했 기 때문에 이 브 라 우 저 들 이 페이지 내용 을 표시 할 수 있 도록 추가 빈 칸 을 보 내야 합 니 다.
  •  예 를 들 면:
    
    <?php
    /**
    Server:LightTPD/1.4.28 (Win32)
    X-Powered-By:PHP/5.3.27
    */
    echo '    '."<BR>";
    ob_flush();
    flush();
    sleep(1);
    echo '    ';
    
    //output
    
    위의 코드 는 chrome 브 라 우 저 위 에서 한 줄 한 줄 의 출력 이 고 ie 시리즈 의 브 라 우 저 는 모든 출력 입 니 다.사실은 위의 네 번 째 브 라 우 저 입 니 다.256 자 를 받 아야 표시 합 니 다.위의 코드 를 아래 형식 으로 바 꿉 니 다.
    
    <?php
    /**
    Server:LightTPD/1.4.28 (Win32)
    X-Powered-By:PHP/5.3.27
    */
    echo str_pad('',240)."
    "; echo ' '."<BR>"; ob_flush(); flush(); sleep(1); echo ' '; //output
    이렇게 하면 i 아래 에서 한 줄 한 줄 출력 합 니 다.256 글자 가 넘 기 때 문 입 니 다.
      ob 기타 함수 설명
    1.ob_end_flush 와 obend_clean
    end 는 말 그대로 끝 납 니 다.버퍼 를 닫 습 니 다.모두 출력 버퍼 를 닫 습 니 다.하 나 는 출력 버퍼 이 고 하 나 는 제거 입 니 다.예 를 들 면
    
    <?php
    /**
    Server:LightTPD/1.4.28 (Win32)
    X-Powered-By:PHP/5.3.27
    */
    echo 'before';
    ob_end_clean();
    echo str_pad('',4096)."
    "; for ($i=10; $i>0; $i--) { echo $i; sleep(1); }
    위 코드 는 출력 이 아 닌 모든 내용 을 출력 합 니 다.ob_end_clean()버퍼 가 꺼 진 거 아니에요?왜 하나의 출력 이 아 닙 니까?사실 우리 위 에서 도 말 했 듯 이 phop 은 브 라 우 저 에 직접 출력 하 는 것 이 아니 라 웹 server 입 니 다.php 에 버퍼 가 없 지만그래도 웹 서버 는 있어 요.그래서 다음 코드:
    
    /**
    Server:LightTPD/1.4.28 (Win32)
    X-Powered-By:PHP/5.3.27
    */
    echo 'before';
    ob_end_clean();
    echo str_pad('',4096)."
    "; for ($i=10; $i>0; $i--) { flush(); echo $i; sleep(1); }
    flush()를 더 하면 한 줄 한 줄 출력 합 니 다.하면,만약,만약...end_clean 을 ob 로 바꾸다end_flush  before 를 지 겠 습 니 다.
    기타 함 수 는 수첩 을 참고 할 수 있어 비교적 간단 하 다.
      총결산
    php 스 크 립 트 를 브 라 우 저 로 이동 하려 면  php buffer=》web server buffer=》browser buffer。 마지막 으로 브 라 우 저 에 표 시 됩 니 다.하나 가 없어 서 는 안 된다.그래서 우 리 는 obflush 와  flush  echo str_pad(',4096)만 당신 이 원 하 는 효 과 를 디 버 깅 할 수 있 습 니 다.
    이상 은 PHP 버퍼 에 대한 자 료 를 정리 한 다음 에 관련 자 료 를 계속 보충 하 는 것 입 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

    좋은 웹페이지 즐겨찾기