header 와 버퍼 간 의 심층 분석

2158 단어 phpheader버퍼
header 를 테스트 하기 전에 출력 이 있 습 니 다.

<?php
echo 'hello world!';
header('content-type: text/html;charset=utf-8;');
나 는 테스트 를 거 쳤 을 때 성공 할 수 있 으 며 어떠한 오류 와 경고 도 일어나 지 않 을 것 이다.어떻게 지 내 셨 는 지 모 르 겠 어 요.그러나 대부분 문제 가 없다 고 생각 합 니 다.Cannot modify header information - headers already sent이런 경고 가 나 오 면 머리 메 시 지 를 수정 할 수 없고 머리 메 시 지 는 이미 보 냈 습 니 다.내 려 와 서 왜 두 가지 다른 결과 가 나 왔 는 지 알 아 볼 까요?
버퍼
비 유 를 하면 우리 가 영 화 를 볼 때의 캐 시 와 같다.그것 은 우리 에 게 즉시 재생 되 지 않 고 먼저 다운로드 한 영 화 를 캐 시 에 넣 은 다음 캐 시 로 재생 합 니 다.저희 가 php 코드 를 만 드 는 것 도 이 렇 습 니 다.
php 캐 시 메커니즘-output_bufferingphp 에서 자주 사용 되 는 함수obob_start:출력 버퍼 열기
ob_clean: 버퍼 제거
ob_get_contents: 버퍼 내용 되 돌리 기
ob_get_clean: 버퍼 내용 을 되 돌려 주 고 비 웁 니 다.

<?php
ob_start();
echo 'hello world!';
echo ob_get_contents();//  hello world!hello world!
php.ini 설정 파일 에서 버퍼 크기 변경
일반적으로 233 줄 정도 이 고,기본 값 은 4096 으로 4096 바이트 즉 4kB 를 나타 낸다.
내 려 와 서 4096 을 5 로 수정 하고 이 코드 를 다시 실행 합 니 다.

<?php
echo 'hello world!';
header('content-type: text/html;charset=utf-8;');
방금 테스트 에서 경고 나 오류 가 발생 하지 않 았 는데 지금 오류 가 발생 했 습 니 다.오 류 는 바로:Cannot modify header information - headers already sent입 니 다.
header 와 버퍼 사이 의 분석
왜?
header 함수 에 대해 클 라 이언 트 가 원본 http 헤 더 를 보 내 는 것 은 우리 가 쓴 웹 페이지 가 도대체 어떤 내용 인지 설명 하 는 것 입 니 다.따라서 이 성명 전에 내용 이 있 으 면 잘못된 것 이 고 http 규칙 에 부합 되 지 않 습 니 다.
내 려 와 서 phop 의 header 를 말 해 보 세 요.
php 에서 header 는 버퍼 를 거치 지 않 고 서버 를 거 쳐 클 라 이언 트 로 직접 출력 합 니 다.
이전 경고 설명 Cannot modify header information
헤더 에 출력 을 썼 을 때 버퍼 를 먼저 지나 갑 니 다.따라서 앞에서 썼 더 라 도 최종 출력 순 서 는 headerecho에 있 습 니 다.
그러나 우리 가 출력 한 콘 텐 츠 캐 시 영역 은 이전 출력hello world!'>5 바이트 입 니 다.바로 출력 됩 니 다.즉,이렇게 먼저 지고 'hello world'다시header(...),이렇게 하면 실제 header 에 어 긋 나 기 전에 출력 이 있 으 면 안 됩 니 다.
총결산
실제 상황 에서 우 리 는 header 를 페이지 맨 앞 에 쓰 는 것 이 좋 겠 다.헤더 이전의 출력 내용 이 버퍼 를 내 려 놓 을 수 있 을 지 확실 하지 않 기 때문이다.본문 이 모두 에 게 phop 을 배 우 는 데 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기