PHP의 "Headers already sent" 오류를 수정하는 방법
스크립트를 실행할 때 다음과 같은 오류가 여러 개 발생합니다.
경고: 헤더 정보를 수정할 수 없습니다.헤더는 이미 23행의 /some/file.php:12에서 출력 시작)에 의해 /some/some/file:php
에러 메시지에 기재되어 있는 행에는 및 콜이 포함되어 있습니다.
이유가 뭘까요?어떻게 고칠까요?
헤더를 보내기 전에 출력이 없습니다!
HTTP 헤더를 송신 또는 변경하는 함수는 출력을 작성하기 전에 호출해야 합니다.개요 » 그렇지 않으면 콜이 실패합니다.
경고: 헤더 정보를 수정할 수 없습니다. 헤더는 이미 전송되었습니다(출력은 script: line에서 시작됨).
HTTP 헤더를 변경하는 기능은 다음과 같습니다.
출력은 다음과 같습니다.
의도하지 않음:
- 에 、 백 、 앞의
<?php
그 후에?>
- 특히 UTF-8 바이트 순서 마크
- 이전 오류 메시지 또는 알림
- 에 、 백 、 앞의
의도적:
print
,echo
출력을 하는 기타- raw
<html>
의 의 항<?php
왜 이렇게 될까요?
출력 전에 헤더를 전송해야 하는 이유를 이해하려면 일반적인 HTTP 응답을 살펴봐야 합니다.PHP 스크립트는 주로 HTML 콘텐츠를 생성하지만 HTTP/CGI 헤더 세트를 웹 서버에 전달합니다.
HTTP/1.1 200 OK
Powered-By: PHP/5.3.7
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8
<html><head><title>PHP page output page</title></head>
<body><h1>Content</h1> <p>Some more output follows...</p>
and <a href="/"> <img src=internal-icon-delayed> </a>
페이지/출력은 항상 머리글 뒤에 있습니다.PHP는 먼저 헤더를 웹 서버에 전달해야 합니다.그건 한 번만 할 수 있어요.이중 줄 바꿈 후에는 더 이상 수정할 수 없습니다.
가 첫 출력PHP)을 때(PHP)print
,echo
,<html>
수집된 모든 헤더를 플래시합니다.그 후, 필요한 출력을 모두 송신할 수 있습니다.단, HTTP 헤더를 더 이상 송신할 수 없습니다.
조기출력이 어디서 발생했는지 어떻게 알 수 있습니까?
header()
경고에는 문제의 원인을 찾기 위한 모든 관련 정보가 포함되어 있습니다.
경고: 헤더 정보를 수정할 수 없습니다.헤더는 100행의 /www/usr2345/htdocs/auth.php:52)에 의해 이미 송신되었습니다.
100은 'line 100'이 되는 .header()
호출에 실패했습니다.
괄호 안의 "output started at" 노트가 더 중요합니다.이전 출력의 출처를 나타냅니다.이 예에서는,auth.php
및 행을 지정합니다.바로 이 부분에서 조기출력을 찾아야 했습니다.
일반적인 원인:
인쇄, 에코
「 」로부터의 인 출력
print
★★★★★★★★★★★★★★★★★」echo
HTTP 헤더를 송신할 기회를 종료합니다.이를 피하기 위해 어플리케이션플로우를 재구성해야 합니다.함수 및 템플리트 방식을 사용합니다.확신해주다header()
콜은 메시지가 작성되기 전에 발생합니다.출력을 생성하는 함수는 다음과 같습니다.
print
,echo
,printf
,vprintf
trigger_error
,ob_flush
,ob_end_flush
,var_dump
,print_r
readfile
,passthru
,flush
,imagepng
,imagejpeg
이치원시 HTML 영역
섹션의 파싱 해제
.php
파일도 직접 출력입니다.를 트리거하는header()
raw 전에 콜을 기록해야 합니다.<html>
★★★★★★ 。<!DOCTYPE html> <?php // Too late for headers already.
템플릿 방식을 사용하여 출력 로직에서 처리를 분리합니다.
- 폼 처리 코드를 스크립트 위에 배치합니다.
- 메시지를 지연시키려면 임시 문자열 변수를 사용합니다.
- 실제 출력 로직과 혼합HTML 출력은 마지막에 이어집니다.
에 、 백 、 앞의
<?php
"스크립트"를 선택합니다.php 행 1" 경고경고가 출력 인라인을 가리킬 경우 시작 전에 주로 선행 공백, 텍스트 또는 HTML입니다.
<?php
token.token.syslog.<?php # There's a SINGLE space/newline before <? - Which already seals it.
마찬가지로 추가된 스크립트 또는 스크립트섹션에서도 발생할 수 있습니다.
?> <?php
PHP는 실제로 클로즈 태그 후에 한 줄 바꿈을 소비합니다.그러나 이러한 공백으로 전환된 여러 줄의 새 줄이나 탭 또는 공간을 보상하지는 않습니다.
UTF-8 BOM
줄 바꿈과 공백만 문제가 될 수 있습니다.그러나 이를 일으킬 수 있는 "보이지 않는" 문자 시퀀스도 있습니다.대부분의 텍스트 편집기에는 표시되지 않는 UTF-8 BOM(바이트 순서 표시)이 가장 잘 알려져 있습니다.바이트 시퀀스입니다.
EF BB BF
UTF-8 부호화 문서의 경우 옵션이며 용장성이 있습니다.PHP raw raw 는는는 。이것은 캐릭터로 표시될 수 있습니다.
출력(클라이언트가 문서를 Latin-1로 해석하는 경우) 또는 유사한 "쓰레기"로 표시됩니다.특히 그래픽 에디터와 Java 기반 IDE는 그 존재를 인식하지 못합니다.(Unicode 표준에 따라) 시각화하지 않습니다.그러나 대부분의 프로그래머 및 콘솔 편집자는 다음과 같은 작업을 수행합니다.
거기서 문제를 조기에 인식하기 쉽습니다.다른 에디터는 파일/설정 메뉴(Windows의 Notepad++로 문제를 식별하고 해결할 수 있음)에서 BOM의 존재를 식별할 수 있습니다.또 다른 옵션은 16진수 에디터에 의존합니다.*nix 시스템에서는 보통 다음과 같은 문제를 간단하게 감사할 수 있는 그래픽 변형은 아니더라도 사용할 수 있습니다.
간단한 수정 방법은 텍스트 편집기가 파일을 "UTF-8(BOM 없음)" 또는 이와 유사한 이름으로 저장하도록 설정하는 것입니다.그렇지 않으면 신규 사용자는 새로운 파일을 만들고 이전 코드를 복사하여 붙여넣기만 하는 경우가 많습니다.
유틸리티
텍스트 파일을 검사하고 다시 쓰는 자동화된 도구도 있습니다(/
sed
awk
또는recode
PHP에는 태그 tidier가 있습니다.닫힘 및 열린 태그를 길고 짧은 형식으로 다시 쓰지만 선행 및 후행 공백, Unicode 및 UTF-x BOM 문제도 쉽게 해결할 수 있습니다.phptags --whitespace *.php
전체 include 또는 프로젝트 디렉토리에서 사용하는 것이 안전합니다.
음음 뒤에 이 있다
?>
에러 소스가 클로징의 배후에 기재되어 있는 경우는, 여기서 공백 또는 미가공의 텍스트가 기입됩니다.PHP 엔드 마커는 이 시점에서 스크립트 실행을 종료하지 않습니다.그 뒤의 텍스트/스페이스 문자는 페이지 내용으로 계속 작성됩니다.
온 에게는 후행하는
?>
PHP 닫기 태그는 생략해야 합니다.이것은 이러한 사례의 작은 부분을 회피한다.(일반적으로)include()d
스크립트가 원인입니다.)오류 소스가 "Unknown on line 0"으로 표시됩니다.
일반적으로 오류 소스가 구체화되지 않은 경우 PHP 확장자 또는 php.ini 설정입니다.
gzip
스트림 부호화 설정 또는 를 참조.- 으로 적재된 어떤 될 수 있습니다.
extension=
모듈이 암묵적인 PHP 시작/경고 메시지를 생성합니다.
이전 오류 메시지
다른 PHP 문 또는 표현으로 인해 경고 메시지 또는 알림이 출력되는 경우 이 또한 시기상조 출력으로 간주됩니다.
이 경우 나중에 디버깅에 방해가 되지 않는 경우 또는 - 등의 방법으로 오류를 회피하거나 스테이트먼트 실행을 지연하거나 메시지를 억제해야 합니다.
오류 메시지 없음
「 」가 error_reporting
★★★★★★★★★★★★★★★★★」display_errors
per " " " disabled disabled disabled"php.ini
경고는 표시되지 않습니다.하지만 오류를 무시한다고 문제가 사라지지는 않을 것입니다.조기 출력 후에도 헤더를 보낼 수 없습니다.
★★★★★★★★★★★★★★★★★★.header("Location: ...")
리다이렉트는 자동으로 실패합니다.경고를 조사하는 것이 좋습니다.호출 스크립트 상단에 있는 다음 두 가지 간단한 명령을 사용하여 다시 활성화합니다.
error_reporting(E_ALL);
ini_set("display_errors", 1);
★★★set_error_handler("var_dump");
른른 츠키
리다이렉트 헤더에 대해서는, 최종 코드 패스에 대해서, 다음과 같은 어구를 사용하는 것이 좋습니다.
exit(header("Location: /finished.html"));
는, 「 기능에서도, 「유틸리티 기능」이, 가 인쇄됩니다.header()
에러가 발생하고 있습니다.
회피책으로서의 출력 버퍼링
PHP 출력 버퍼링은 이 문제를 완화하기 위한 회피책입니다.신뢰성 있게 동작하는 경우가 많지만 적절한 애플리케이션 구조화와 제어 로직으로부터의 출력 분리를 대신해서는 안 됩니다.실제 목적은 웹 서버로의 청크 전송을 최소화하는 것입니다.
그래도 설정이 도움이 될 수 있습니다.최신 FPM/Fast CGI 설정에서는 php.ini 또는 .htaccess 또는 .user.ini를 사용하여 설정합니다.
는 HTTP를 집약할 수 .「PHP」HTTP입니다.마찬가지로 호출 스크립트의 선두에 대한 호출과 관련될 수 있습니다.그러나 다음과 같은 여러 가지 이유로 신뢰성이 떨어집니다.
따라서 두 접근 방식 모두 신뢰할 수 없게 될 수 있습니다. 특히 개발 설정 및/또는 운영 서버 간에 전환할 때 더욱 그렇습니다.이것이 출력 버퍼링이 목발에 불과한/엄밀히 말하면 회피책으로 간주되는 이유입니다.
설명서의 기본 사용 예시와 더 많은 장단점에 대해서도 참조하십시오.
- 출력 버퍼링이란 무엇입니까?
- PHP에서 출력 버퍼링을 사용하는 이유는 무엇입니까?
- 출력 버퍼링을 사용하는 것은 나쁜 관행으로 간주됩니까?
- 출력 버퍼링을 "이미 발송된 헤더"에 대한 올바른 해결책으로 사용하는 경우
하지만 다른 서버에서는 작동했어!?
이전에 헤더 경고를 받지 않았다면 출력 버퍼링 php.ini 설정이 변경되었습니다.현재/새 서버에서 구성되지 않은 것 같습니다.
으로 중headers_sent()
그래도 가능하다면 언제든지 탐사에 사용할 수 있습니다.헤더를 송신합니다.조건부로 정보를 인쇄하거나 다른 폴백 로직을 적용하는 데 유용합니다.
if (headers_sent()) {
die("Redirect failed. Please click on this link: <a href=...>");
}
else{
exit(header("Location: /user.php"));
}
유용한 폴백 회피책은 다음과 같습니다.
HTML
<meta>
부착어플리케이션인 하는 간단한않은) 은 HTML을 입니다.
<meta>
같이 실행할 수 . 리다이렉트는 다음 방법으로 실행할 수 있습니다.<meta http-equiv="Location" content="http://example.com/">
또는 짧은 지연 시간:
<meta http-equiv="Refresh" content="2; url=../target.html">
로 인해 HTML을 할 때 됩니다.
<head>
★★★. 대응하고 있습니다.대부분의 브라우저는 여전히 이 기능을 사용합니다.JavaScript 리다이렉트
페이지 리다이렉트에 JavaScript 리다이렉트를 사용할 수도 있습니다.
<script> location.replace("target.html"); </script>
은 많은 만, HTML에 준거하고 있습니다.
<meta>
자바스크립트
다만, 어느 어프로치에서도, 정규 HTTP header() 콜이 실패했을 경우는, 폴백이 허용됩니다.이상적으로는 항상 이를 사용자에게 친숙한 메시지 및 클릭 가능한 링크와 조합합니다(예를 들어 http_redirect() PECL 확장의 기능).
★★★★setcookie()
★★★★★★★★★★★★★★★★★」session_start()
을 받다
다.setcookie()
★★★★★★★★★★★★★★★★★」session_start()
할 Set-Cookie:
따라서 "는시 됩니다.따라서 동일한 조건이 적용되며, 조기 출력 시 유사한 오류 메시지가 생성됩니다.
(물론 브라우저에서 비활성화된 쿠키나 프록시 문제로 인해 더 큰 영향을 받습니다.세션 기능은 빈 디스크 영역 및 기타 php.ini 설정 등에 따라 달라집니다.)
기타 링크
- 구글은 유사한 토론의 긴 목록을 제공한다.
- 물론 Stack Overflow에서도 많은 특정 사례가 다루어졌습니다.
- WordPress FAQ에서는 이미 전송된 헤더의 경고 문제를 해결하려면 어떻게 해야 합니까?일반적인 방법으로
- Adobe 커뮤니티: PHP 개발: 리다이렉트가 작동하지 않는 이유(헤더는 이미 전송됨)
- Nuclear FAQ: "page headers are sent" (페이지 헤더가 이미 전송되었습니다)는 무슨 뜻입니까?
- 자세한 설명 중 하나는 HTTP Headers와 PHP Header() Function - NicholasSolutions의 튜토리얼(Internet Archive 링크)입니다.HTTP에 대해 자세히 설명하고 스크립트를 다시 작성하기 위한 몇 가지 지침을 제공합니다.
이 에러 메시지는, HTTP 헤더(또는 )를 송신하기 전에 송신되었을 때에 트리거 됩니다.HTTP 헤더보다 먼저 출력하는 일반적인 이유는 다음과 같습니다.
다음과 같은 우발적인 공백(대부분 파일의 시작 또는 끝에 있음)
<?php // Note the space before "<?php" ?>
, 「마지막」은 .?>
필요 요.- 필요 없어요. - 필요 없어요.
- php 파일의 선두에 바이트 순서 마크가 표시됩니다.16진수 에디터로 php 파일을 조사하여 해당 여부를 확인합니다.바이트로 시작해야 합니다.
3F 3C
. BOM은 할 수EF BB BF
파일 시작 부분부터 시작합니다. - 의 인 출력
echo
,printf
,readfile
,passthru
앞, 코드, 「」<?
syslog. - php.ini 속성이 설정되어 있는 경우 php에 의해 출력되는 경고입니다.프로그래머의 실수로 크래시하는 대신 php는 자동으로 오류를 수정하고 경고를 보냅니다.또는 error_reporting 설정을 변경할 수 있지만 문제를 수정해야 합니다.
요소(「」등입니다.$_POST['input']
입력이 설정되어 있는지 여부를 테스트하지 않거나 문자열 리터럴 대신 정의되지 않은 상수를 사용합니다(와 같이).$_POST[input]
략된따따따따따참참참참참참참참참참)
출력 버퍼링을 켜면 문제가 해소됩니다.콜 후 버퍼를 해제할 때까지 모든 출력은 메모리에 버퍼링됩니다(예: ).
단, 출력 버퍼링은 문제를 회피하지만 응용 프로그램이 HTTP 헤더보다 먼저 HTTP 본문을 출력하는 이유를 파악해야 합니다.그것은 전화를 받고 전화를 건 사람에게 전화를 잘못 걸었다고 말하기 전에 당신의 하루와 날씨에 대해 의논하는 것과 같습니다.
이 에러는 이전에 여러 번 발생했으며, 모든 PHP 프로그래머가 적어도 한 번은 발생했다고 확신합니다.
생각할 수 있는 해결책 1
이 오류는 파일 시작 전 또는 파일 종료 후에 공백이 있기 때문에 발생할 수 있습니다.이 공백은 여기에 있으면 안 됩니다.
ex) 여기에 공백이 없어야 합니다.
echo "your code here";
?>
THERE SHOULD BE NO BLANK SPACES HERE
이 에러의 원인이 되는 파일과 관련된 모든 파일을 체크합니다.
주의: 경우에 따라 gedit(기본 Linux 편집기)와 같은 EDITOR(IDE)가 저장 파일에 빈 줄을 추가할 수 있습니다.이런 일은 일어나서는 안 된다.Linux 를 사용하고 있는 경우는, VI 에디터를 사용하고, 페이지의 마지막에 스페이스나 행을 삭제할 수 있습니다.
생각할 수 있는 해결책 2: 이 경우가 아닌 경우 ob_start를 사용하여 버퍼링을 출력합니다.
<?php
ob_start();
// code
ob_end_flush();
?>
그러면 출력 버퍼링이 켜지고 페이지가 버퍼링된 후 헤더가 생성됩니다.
아래 줄 대신
//header("Location:".ADMIN_URL."/index.php");
쓰다
echo("<script>location.href = '".ADMIN_URL."/index.php?msg=$msg';</script>");
또는
?><script><?php echo("location.href = '".ADMIN_URL."/index.php?msg=$msg';");?></script><?php
그것은 분명히 당신의 문제를 해결해 줄 거예요.저도 같은 문제에 직면했지만, 위와 같이 헤더 위치를 작성함으로써 해결했습니다.
넌 그래.
printf ("Hi %s,</br />", $name);
쿠키를 설정하기 전에, 이것은 허용되지 않습니다.헤더 앞에 출력을 보낼 수 없습니다.빈 줄도 마찬가지입니다.
일반적인 문제:
(출처: 소스)
====================
1) 명령어 앞에는 출력(HTML 코드)이 없어야 합니다.
2) 공백(또는 줄바꿈)을 삭제하기 전에<?php
그후 뒤에?>
3) GOLDEN RULE! - 그 php 파일이 있는지 확인합니다(또한include
(UTF-8뿐만 아니라) BOM 인코딩이 없는 UTF8이 있습니다.이것은 많은 경우에 문제가 됩니다(UTF8 인코딩 파일의 php 파일 선두에 텍스트 에디터에 표시되지 않는 특수 문자가 포함되어 있기 때문입니다).
4) 이후header(...);
돼요.exit;
5) 항상 301 또는 302 참조를 사용합니다.
header("location: http://example.com", true, 301 ); exit;
6) 에러 리포트를 유효하게 하고, 에러를 검출합니다.기능하지 않는 것이 에러의 원인일 가능성이 있습니다.오류 보고를 실행할 때는 항상 최상위 오류를 먼저 수정해야 합니다.예를 들어 "경고: date_default_timezone_get():시스템의 타임존 설정에 의존하는 것은 안전하지 않습니다.-아래쪽에 "headers not send" (헤더가 송신되지 않음) 에러가 표시될 수 있습니다.최상위(1번째) 오류를 수정한 후 페이지를 다시 로드합니다.그래도 오류가 발생할 경우 최상위 오류를 다시 수정하십시오.
7) 위의 어느 것도 도움이 되지 않는 경우, JAVSCRIPT 리다이렉트(단, 강력히 권장되지 않는 방법)를 사용해 주세요.커스텀 케이스에서는 마지막 기회가 될 수 있습니다.:
echo "<script type='text/javascript'>window.top.location='http://website.com/';</script>"; exit;
그 이유는 다음과 같습니다.
printf ("Hi %s,</br />", $name);
헤더를 송신하기 전에, 인쇄나 에코를 실시하지 말아 주세요.
첫 번째 (또는 않는 특수 ) 바로 단순한(또는 않는 특수 문자)<?php
태그가 원인일 수 있습니다.특히, 팀내에서 일하고 있는 경우나, 누군가가 「약한」IDE 를 사용하고 있거나, 이상한 텍스트 에디터로 파일을 조작하고 있는 경우 등입니다.
나는 이런 것들을 본 적이 있다;)
아직 언급되지 않은 이 문제를 일으킬 수 있는 또 다른 악습이 있습니다.
다음 코드 스니펫을 참조하십시오.
<?php
include('a_important_file.php'); //really really really bad practise
header("Location:A location");
?>
다 괜찮은 거지?
"a_important_file.php"가 다음과 같은 경우:
<?php
//some php code
//another line of php code
//no line above is generating any output
?>
----------This is the end of the an_important_file-------------------
이거 안 돼요? 왜요?이미 새로운 라인이 생성되어 있기 때문입니다.
일반적인 시나리오는 아니지만 컨트롤러로 데이터를 인계하기 전에 많은 파일을 로드하는 MVC 프레임워크를 사용하는 경우에는 어떻게 해야 할까요?이것은 드문 시나리오가 아닙니다.각오해라.
- 은 "PHP"를 해야 합니다.
Unix LF (linefeed) line ending
. - 은 "PHP"로 합니다.
single blank line
. - 는 closing?> > > > > > > > > > > > > > > > > > > > >>
omitted
포함하는only php
나를 믿으세요, 이 기준을 따르면 당신의 삶에서 많은 시간을 절약할 수 있습니다:)
개발 프로세스에 WIN 워크스테이션과 LINUX 시스템(호스팅)이 모두 포함되어 있고 코드에서 관련 행 앞에 출력이 표시되지 않는 경우 파일 포맷과 Unix LF(라인피드) 행이 종료되지 않을 수 있습니다.
이 문제를 신속하게 해결하기 위해 일반적으로 파일 이름을 변경하고 LINUX 시스템에서 이름이 바뀐 파일이 아닌 새 파일을 만든 다음 내용을 복사합니다.WIN에서 작성된 파일 중 일부가 호스팅으로 이동하면 문제가 해결되는 경우가 많습니다.
이 수정은 FTP로 관리하는 사이트에 대한 간단한 수정이며, 경우에 따라서는 새로운 팀원을 구할 수 있습니다.
일반적으로 이 에러는 에코 또는 인쇄 후에 헤더를 송신할 때 발생합니다.이는, 그가 아무것도 하고 않은 것을 , 「 」, 「 」에 콜 해 주세요.start_session()
.
예측 불가능한 오류의 예:
<?php //a white-space before <?php also send for output and arise error
session_start();
session_regenerate_id();
//your page content
또 하나의 예:
<?php
includes 'functions.php';
?> <!-- This new line will also arise error -->
<?php
session_start();
session_regenerate_id();
//your page content
": "를 호출하기 전에 문자도 ."session_start()
★★★★★★★★★★★★★★★★★」header()
하지 .
언급URL : https://stackoverflow.com/questions/8028957/how-to-fix-headers-already-sent-error-in-php
'programing' 카테고리의 다른 글
standard_init_linux.go: exec 사용자 프로세스로 인해 "exec 형식 오류"가 발생했습니다. (0) | 2022.10.15 |
---|---|
새로운 java.io을 작성하는 방법메모리에 파일이 있습니까? (0) | 2022.10.15 |
도커에 GD 설치 (0) | 2022.10.15 |
Mysql/Maridb Python Connector가 테이블에 데이터를 로드하지 않습니다. (0) | 2022.10.15 |
특정 열을 가져오기 위한 휴지 상태 조건 쿼리 (0) | 2022.10.15 |