PHP 프로그래밍에서 헤더 기능은 일반적으로 리디렉션, 컨텐츠 유형 등에 사용되는 원시 HTTP 헤더를 클라이언트로 보내는 데 사용됩니다. 그러나 개발 중에는 공통 오류가 발생할 수 있습니다. 헤더는 이미 전송됩니다 . 이 오류는 일반적으로 출력을 보낸 후 헤더 () 함수를 사용하려고 할 때 발생합니다.
오늘날, 우리는이 오류의 원인을 파고 실용적인 사례를 사용하여 OB_START ()를 사용하여이를 해결하는 방법을 보여줄 것입니다.
PHP에서는 페이지가 출력하기 전에 헤더 () 함수를 호출해야합니다. HTML 태그, 공백 또는 오류 메시지와 같은 출력 후 Header ()가 호출되면 PHP는 이미 오류를 보낸 헤더를 던집니다. PHP는 HTTP 헤더를 브라우저로 보내려고하지만 이미 콘텐츠 출력이 있기 때문에 더 이상 HTTP 헤더를 수정할 수 없어 오류가 발생할 수 없습니다.
예상치 못한 공간 또는 신성 공간 : 가장 일반적인 이유는 파일의 시작 또는 끝에 여분의 공간이나 신약이 있기 때문입니다. PHP 파일의 시작 부분에서 <? php 태그 이전 또는 ?> 태그가 끝난 후에 출력이있어 PHP가 자동으로 HTTP 헤더를 보냅니다.
HTML 또는 기타 출력 컨텐츠 : PHP 스크립트가 HTML, ECHO 문 또는 기타 비 PHP 출력을 출력하는 경우 Header ()를 호출하기 전에 헤더가 이미 오류를 보낼 수 있습니다.
일반적인 솔루션은 PHP의 출력 버퍼 기능 OB_Start () 를 사용하여 Header ()를 호출하기 전에 콘텐츠 출력을 피하는 것입니다.
다른 페이지로 리디렉션하려고 시도하는 간단한 PHP 스크립트가 있지만 실행 중에 이미 전송 된 헤더를 만난다 고 가정 해 봅시다.
문제 코드 :
<?php
// 파일의 시작 부분에 예기치 않은 공간이나 라인 브레이크가 있다고 가정합니다.
echo "This is some content before the header.";
// 리디렉션을 시도하십시오
header("Location: http://m66.net/anotherpage.php");
exit();
?>
이 코드를 실행하면 브라우저에 다음 오류 메시지가 표시 될 수 있습니다.
Warning: Cannot modify header information - headers already sent by (output started at /path/to/script.php:2) in /path/to/script.php on line 6
문제의 이유는 Echo가 컨텐츠를 출력하여 HTTP 헤더를 전송하기 때문입니다. 따라서 헤더 () 함수가 호출되면 더 이상 헤더를 수정할 수 없습니다.
PHP의 출력 버퍼 기능을 사용 하여이 문제를 해결할 수 있습니다. OB_START () 함수는 출력 버퍼를 활성화하므로 코드에 출력이 있더라도 PHP는 스크립트가 실행되거나 OB_end_flush ()가 호출 될 때까지 버퍼에 컨텐츠를 저장합니다.
해결 된 코드 :
<?php
// 출력 버퍼를 켭니다
ob_start();
// 파일의 시작 부분에 예기치 않은 공간이나 라인 브레이크가 있다고 가정합니다.
echo "This is some content before the header.";
// 리디렉션을 시도하십시오
header("Location: http://m66.net/anotherpage.php");
exit();
// 출력 버퍼를 종료하고 모든 것을 보내십시오
ob_end_flush();
?>
이 수정 된 코드에서 OB_START ()는 출력 버퍼를 활성화합니다. 에코가 콘텐츠를 출력하더라도 컨텐츠는 즉시 브라우저로 전송되지 않지만 스크립트가 실행될 때까지 버퍼에 캐시됩니다. Header () 함수를 호출 할 때 PHP는 HTTP 헤더를 여전히 수정하여 헤더가 이미 전송 된 오류를 피할 수 있습니다.
OB_START () 및 출력 버퍼를 사용하면 헤더 () 함수를 호출 할 때 "헤더 이미 전송 된"오류를 피할 수 있습니다. 이 접근법은 실제 개발에 매우 유용합니다. 특히 다른 출력 (예 : 수입 파일 또는 타사 라이브러리)을 제어 할 수없는 경우.
이런 종류의 오류가 발생하면 문제를 해결하기 위해 코드 시작에 OB_START ()를 추가 해보십시오. 간단하고 효과적인 솔루션입니다.