복붙노트

PHP에서 "헤더가 이미 전송되었습니다"오류를 수정하는 방법

PHP

PHP에서 "헤더가 이미 전송되었습니다"오류를 수정하는 방법

스크립트를 실행하면 다음과 같은 오류가 발생합니다.

오류 메시지에 언급 된 행은 header () 및 setcookie () 호출을 포함합니다.

이것에 대한 이유는 무엇일까요? 그리고 그것을 고치는 방법?

해결법

  1. ==============================

    1.

    출력을하기 전에 HTTP 헤더를 보내거나 수정하는 함수를 호출해야합니다. 요약 그렇지 않으면 호출이 실패합니다.

    HTTP 헤더를 수정하는 함수는 다음과 같습니다.

    출력은 다음과 같습니다.

    출력 전에 헤더를 보내야하는 이유를 이해하려면 일반적인 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가 첫 번째 출력 (print, echo, )을 받으면 모든 수집 된 헤더를 플러시합니다. 이후 모든 출력을 보낼 수 있습니다. 그것은 원한다. 그러나 추가 HTTP 헤더를 보내는 것은 불가능합니다.

    header () 경고는 다음에 대한 모든 관련 정보를 포함합니다. 문제의 원인을 찾으십시오.

    여기서 "line 100"은 header () 호출이 실패한 스크립트를 나타냅니다.

    괄호 안에있는 "출력 시작"메모가 더 중요합니다. 이전 산출물의 출처를 나타냅니다. 이 예제에서는 auth.php입니다. 그것이 바로 당신이 조숙 한 결과물을 찾아야 만하는 곳입니다.

    일반적인 원인 :

    php.ini에 대해 error_reporting 또는 display_errors가 비활성화되어 있다면, 아무 경고도 나타나지 않을 것이다. 그러나 오류를 무시해도 문제는 해결되지 않습니다. 떨어져. 조기 출력 후에도 헤더를 전송할 수 없습니다.

    따라서 header ( "Location : ...")가 자동으로 리디렉션되지 않으면 실패합니다. 경고를 조사하는 것이 좋습니다. 두 가지 간단한 명령으로 활성화하십시오. 호출 스크립트 꼭대기 :

    error_reporting(E_ALL);
    ini_set("display_errors", 1);
    

    또는 set_error_handler ( "var_dump"); 다른 모든 것이 실패하면.

    리다이렉트 헤더에 관해서, 당신은 종종 같은 관용구를 사용해야한다. 최종 코드 경로의 경우 :

    exit(header("Location: /finished.html"));
    

    사용자 메시지를 출력하는 utility 함수조차도 바람직합니다. header () 실패의 경우.

    PHP 출력 버퍼링 이 문제를 해결할 수있는 해결 방법입니다. 종종 안정적으로 작동하지만 적절한 애플리케이션을 구조화하고 컨트롤의 출력을 분리한다. 논리. 그것의 실제적인 목적은 웹 서버로의 chunked 전송을 최소화하는 것입니다.

    따라서 두 가지 방법 모두 신뢰할 수 없게 될 수 있습니다 - 특히 개발 설정 및 / 또는 프로덕션 서버. 그래서 출력 버퍼링이 넓게 단지 신조로 간주 / 엄격히 해결.

    기본 사용 예제도 참조하십시오. 매뉴얼에서, 그리고 더 많은 찬부 양론을 위해 :

    이전에 경고 메시지가 표시되지 않으면 출력 버퍼링  php.ini 설정  변경되었습니다. 현재 / 새 서버에서 구성되지 않은 것 같습니다.

    headers_sent ()를 사용하여 if 헤더를 보낼 수 있습니다. 조건부로 인쇄 할 때 유용합니다. 정보 또는 다른 대체 논리를 적용 할 수 있습니다.

    if (headers_sent()) {
        die("Redirect failed. Please click on this link: <a href=...>");
    }
    else{
        exit(header("Location: /user.php"));
    }
    

    유용한 대체 해결 방법은 다음과 같습니다.

    그러나 두 가지 방법 모두 실제 HTTP 헤더 () 호출이 실패합니다. 이상적으로는 사용자 친화적 인 메시지와 최후의 수단으로서 클릭 가능한 링크. (예를 들어, http_redirect () PECL 확장은 않습니다.)

    setcookie ()와 session_start () 모두 Set-Cookie : HTTP 헤더를 보내야합니다. 따라서 동일한 조건이 적용되며 유사한 오류 메시지가 생성됩니다 조숙 한 산출 상황을 위해.

    (물론 그들은 브라우저의 비활성화 된 쿠키에 의해 영향을받습니다. 또는 심지어 프록시 문제. 세션 기능은 분명히 무료입니다. 디스크 공간 및 기타 php.ini 설정 등)

  2. ==============================

    2.

    이 오류 메시지는 HTTP 헤더 (setcookie 또는 헤더 포함)를 보내기 전에 어떤 것이 보내지면 트리거됩니다. HTTP 헤더 앞에 뭔가를 출력하는 일반적인 이유는 다음과 같습니다.

    이를 피하려면 단순히 닫는 것을 생략하십시오.> - 어쨌든 반드시 필요하지는 않습니다.

    출력 버퍼링을 켜면 문제가 해결됩니다. ob_start 호출 후 모든 출력은 버퍼를 해제 할 때까지 메모리에 버퍼링됩니다 (예 : ob_end_flush와 함께.

    그러나 출력 버퍼링이 문제를 피하는 동안 HTTP 헤더 앞에 HTTP 본문이 출력되는 이유를 실제로 확인해야합니다. 그것은 전화를 걸고 발신자에게 잘못된 번호를 알리기 전에 하루와 날씨를상의하는 것과 같습니다.

  3. ==============================

    3.

    전에이 오류가 여러 번 발생했습니다. 모든 PHP 프로그래머가 적어도 한 번이 오류가 발생했습니다. 이 오류를 해결하려면 문제 수준에 따라 사용 솔루션을 해결할 수 있습니다.

    가능한 해결책 1 :

    앞뒤에 공백을 남겨 둘 수도 있습니다 (?> 뒤에 파일 끝 부분에 있음). 즉

    THERE SHOULD BE NO BLANK SPACES HERE
    <?php  
    
       echo "your code here";
    
    ?>
    DO CHECK FOR BLANK SPACES HERE AS WELL; THIS LINE (blank line) SHOULD NOT EXIST.
    

    대개의 경우이 방법으로 문제를 해결해야합니다. 필요한 파일과 관련된 모든 파일을 확인하십시오.

    참고 : 때때로 gedit (기본 Linux 편집기)와 같은 EDITOR (IDE)는 저장 저장 파일에 빈 행을 하나 추가합니다. 당신이 리눅스를 사용한다면. VI 편집기를 사용하여 페이지 끝의?> 뒤에 공백을 제거 할 수 있습니다.

    이것이 아니라면 다음과 같이 출력 버퍼링을 위해 ob_start를 사용할 수 있습니다.

    가능한 해결책 2 :

    <?php
      ob_start();
    
      // code 
    
     ob_end_flush();
    ?> 
    

    그러면 출력 버퍼링이 켜지고 페이지가 버퍼 된 후 헤더가 만들어집니다.

  4. ==============================

    4.

    아래 라인 대신

    //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
    

    그것은 당신의 문제를 확실히 해결할 것입니다. 나는 같은 문제에 직면했지만 위의 방법으로 헤더 위치를 작성하여 해결했습니다.

  5. ==============================

    5.

    printf ("Hi %s,</br />", $name);
    

    쿠키를 설정하기 전에는 허용되지 않습니다. 빈 줄이 아닌 헤더 앞에 어떤 출력도 보낼 수 없습니다.

  6. ==============================

    6.

    이 줄 때문입니다.

    printf ("Hi %s,</br />", $name);
    

    헤더를 보내기 전에는 아무 것도 인쇄하거나 에코해서는 안됩니다.

  7. ==============================

    7.

    간단한 팁 : 스크립트의 첫 번째

    나는이 것을 보았다.)

  8. ==============================

    8.

    (에서 복사 한 : 원본)

    ====================

    1) 헤더 (.......) 앞에 출력 (예 : 에코 .. 또는 HTML 코드)이 없어야합니다. 명령.

    2) 태그 전에 공백 (또는 개행)을 제거하십시오.

    3) 황금률! - PHP 파일 (및 다른 파일을 포함하는 경우)에 BOM 인코딩 (UTF-8 만)이없는 UTF8이 있는지 확인하십시오. 많은 경우에 문제가 있습니다 (UTF8로 인코딩 된 파일은 텍스트 편집기가 표시하지 않는 PHP 파일의 시작 부분에 특수 문자가 있음) !!!!!!!!!!!

    4) 헤더 (...) 뒤에; exit를 사용해야합니다.

    5) 항상 301 또는 302 참조를 사용하십시오.

    header("location: http://example.com",  true,  301 );  exit;
    

    6) 오류보고를 켭니다. 그리고 오류를 말해.

    7) 위의 어느 것도 도움이되지 않는다면 JAVASCRIPT 리디렉션을 사용하십시오 (그러나 강력하게 권장되지 않는 방법). 맞춤형 사례의 마지막 기회 일 수 있습니다.

    echo "<script type='text/javascript'>window.top.location='http://website.com/';</script>"; exit;
    
  9. ==============================

    9.

    또 다른 나쁜 습관은 아직 언급되지 않은이 문제를 일으킬 수 있습니다.

    다음 코드 스 니펫을 참조하십시오.

    <?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 프레임 워크를 사용한다면 어떨까요? 이것은 드문 시나리오는 아닙니다. 이것을 준비하십시오.

    PSR-2에서 2.2 :

  10. ==============================

    10.

    때로는 dev 프로세스에 WIN 워크 스테이션과 LINUX 시스템 (호스팅)이 모두 있고 관련 줄 앞에 출력이 표시되지 않는 경우에는 파일의 형식과 Unix LF (줄 바꿈)  줄 끝.

    이 문제를 신속하게 해결하기 위해 우리가 일반적으로 수행하는 작업은 파일의 이름을 바꾸는 것이며, LINUX 시스템에서는 이름이 바뀐 파일 대신 새 파일을 만든 다음 그 내용을 복사합니다. 여러 번이 문제를 해결하기 위해 WIN에 작성된 파일 중 일부가 호스팅 문제로 옮겨져이 문제가 해결되었습니다.

    이 픽스는 우리가 FTP로 관리하는 사이트에 대한 쉬운 수정이며 때로는 새로운 팀 구성원을 얼마 동안 구할 수 있습니다.

  11. ==============================

    11.

    일반적으로이 오류는 에코 또는 인쇄 후에 헤더를 보낼 때 발생합니다. 이 오류가 특정 페이지에서 발생하면 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 () 함수를 호출하기 전에 문자를 출력하지 마십시오. 공백이나 줄 바꿈도 없습니다.

  12. from https://stackoverflow.com/questions/8028957/how-to-fix-headers-already-sent-error-in-php by cc-by-sa and MIT lisence