Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6814139
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 26, 20262026-05-26T20:39:13+00:00 2026-05-26T20:39:13+00:00

When running my script, I am getting several errors like this: Warning: Cannot modify

  • 0

When running my script, I am getting several errors like this:

Warning: Cannot modify header information – headers already sent by (output started at /some/file.php:12) in /some/file.php on line 23

The lines mentioned in the error messages contain header() and setcookie() calls.

What could be the reason for this? And how to fix it?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-26T20:39:14+00:00Added an answer on May 26, 2026 at 8:39 pm

    No output before sending headers!

    Functions that send/modify HTTP headers must be invoked before any output is made.
    summary ⇊
    Otherwise the call fails:

    Warning: Cannot modify header information – headers already sent (output started at script:line)

    Some functions modifying the HTTP header are:

    • header / header_remove
    • session_start / session_regenerate_id
    • setcookie / setrawcookie

    Output can be:

    • Unintentional:

      • Whitespace before <?php or after ?>
      • The UTF-8 Byte Order Mark specifically
      • Previous error messages or notices
    • Intentional:

      • print, echo and other functions producing output
      • Raw <html> sections prior <?php code.

    Why does it happen?

    To understand why headers must be sent before output it’s necessary
    to look at a typical HTTP
    response. PHP scripts mainly generate HTML content, but also pass a
    set of HTTP/CGI headers to the webserver:

    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>
    

    The page/output always follows the headers. PHP has to pass the
    headers to the webserver first. It can only do that once.
    After the double linebreak it can nevermore amend them.

    When PHP receives the first output (print, echo, <html>) it will
    flush all collected headers. Afterward it can send all the output
    it wants. But sending further HTTP headers is impossible then.

    How can you find out where the premature output occurred?

    The header() warning contains all relevant information to
    locate the problem cause:

    Warning: Cannot modify header information – headers already sent by
    (output started at /www/usr2345/htdocs/auth.php:52) in
    /www/usr2345/htdocs/index.php on line 100

    Here "line 100" refers to the script where the header() invocation failed.

    The "output started at" note within the parenthesis is more significant.
    It denominates the source of previous output. In this example, it’s auth.php
    and line 52. That’s where you had to look for premature output.

    Typical causes:

    1. Print, echo

      Intentional output from print and echo statements will terminate the opportunity to send HTTP headers. The application flow must be restructured to avoid that. Use functions
      and templating schemes. Ensure header() calls occur before messages
      are written out.

      Functions that produce output include

      • print, echo, printf, vprintf
      • trigger_error, ob_flush, ob_end_flush, var_dump, print_r
      • readfile, passthru, flush, imagepng, imagejpeg

      among others and user-defined functions.

    2. Raw HTML areas

      Unparsed HTML sections in a .php file are direct output as well.
      Script conditions that will trigger a header() call must be noted
      before any raw <html> blocks.

      <!DOCTYPE html>
      <?php
          // Too late for headers already.
      

      Use a templating scheme to separate processing from output logic.

      • Place form processing code atop scripts.
      • Use temporary string variables to defer messages.
      • The actual output logic and intermixed HTML output should follow last.
    3. Whitespace before <?php for "script.php line 1" warnings

      If the warning refers to output inline 1, then it’s mostly
      leading whitespace, text or HTML before the opening <?php token.

       <?php
      # There's a SINGLE space/newline before <? - Which already seals it.
      

      Similarly it can occur for appended scripts or script sections:

      ?>
      
      <?php
      

      PHP actually eats up a single linebreak after close tags. But it won’t
      compensate multiple newlines or tabs or spaces shifted into such gaps.

    4. UTF-8 BOM

      Linebreaks and spaces alone can be a problem. But there are also "invisible"
      character sequences that can cause this. Most famously the
      UTF-8 BOM (Byte-Order-Mark)
      which isn’t displayed by most text editors. It’s the byte sequence EF BB BF, which is optional and redundant for UTF-8 encoded documents. PHP however has to treat it as raw output. It may show up as the characters  in the output (if the client interprets the document as Latin-1) or similar "garbage".

      In particular graphical editors and Java-based IDEs are oblivious to its
      presence. They don’t visualize it (obliged by the Unicode standard).
      Most programmer and console editors however do:

      joes editor showing UTF-8 BOM placeholder, and MC editor a dot

      There it’s easy to recognize the problem early on. Other editors may identify
      its presence in a file/settings menu (Notepad++ on Windows can identify and
      remedy the problem),
      Another option to inspect the BOMs presence is resorting to an hexeditor.
      On *nix systems hexdump is usually available,
      if not a graphical variant which simplifies auditing these and other issues:

      beav hexeditor showing utf-8 bom

      An easy fix is to set the text editor to save files as "UTF-8 (no BOM)"
      or similar to such nomenclature. Often newcomers otherwise resort to creating new files and just copy&pasting the previous code back in.

      Correction utilities

      There are also automated tools to examine and rewrite text files
      (sed/awk or recode).
      For PHP specifically there’s the phptags tag tidier.
      It rewrites close and open tags into long and short forms, but also easily
      fixes leading and trailing whitespace, Unicode and UTF-x BOM issues:

      phptags  --whitespace  *.php
      

      It’s safe to use on a whole include or project directory.

    5. Whitespace after ?>

      If the error source is mentioned as behind the
      closing ?>
      then this is where some whitespace or the raw text got written out.
      The PHP end marker does not terminate script execution at this point. Any text/space characters after it will be written out as page content
      still.

      It’s commonly advised, in particular to newcomers, that trailing ?> PHP
      close tags should be omitted. This eschews a small portion of these cases.
      (Quite commonly include()d scripts are the culprit.)

    6. Error source mentioned as "Unknown on line 0"

      It’s typically a PHP extension or php.ini setting if no error source
      is concretized.

      • It’s occasionally the gzip stream encoding setting
        or the ob_gzhandler.
      • But it could also be any doubly loaded extension= module
        generating an implicit PHP startup/warning message.

    7. Preceding error messages

      If another PHP statement or expression causes a warning message or
      notice being printed out, that also counts as premature output.

      In this case you need to eschew the error,
      delay the statement execution, or suppress the message with e.g.
      isset() or @() –
      when either doesn’t obstruct debugging later on.

    No error message

    If you have error_reporting or display_errors disabled per php.ini,
    then no warning will show up. But ignoring errors won’t make the problem go
    away. Headers still can’t be sent after premature output.

    So when header("Location: ...") redirects silently fail it’s very
    advisable to probe for warnings. Reenable them with two simple commands
    atop the invocation script:

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

    Or set_error_handler("var_dump"); if all else fails.

    Speaking of redirect headers, you should often use an idiom like
    this for final code paths:

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

    Preferably even a utility function, which prints a user message
    in case of header() failures.

    Output buffering as a workaround

    PHPs output buffering
    is a workaround to alleviate this issue. It often works reliably, but shouldn’t
    substitute for proper application structuring and separating output from control
    logic. Its actual purpose is minimizing chunked transfers to the webserver.

    1. The output_buffering=
      setting nevertheless can help.
      Configure it in the php.ini
      or via .htaccess
      or even .user.ini on
      modern FPM/FastCGI setups.
      Enabling it will allow PHP to buffer output instead of passing it to the webserver instantly. PHP thus can aggregate HTTP headers.

    2. It can likewise be engaged with a call to ob_start();
      atop the invocation script. Which however is less reliable for multiple reasons:

      • Even if <?php ob_start(); ?> starts the first script, whitespace or a
        BOM might get shuffled before, rendering it ineffective.

      • It can conceal whitespace for HTML output. But as soon as the application logic attempts to send binary content (a generated image for example),
        the buffered extraneous output becomes a problem. (Necessitating ob_clean()
        as a further workaround.)

      • The buffer is limited in size, and can easily overrun when left to defaults.
        And that’s not a rare occurrence either, difficult to track down
        when it happens.

    Both approaches therefore may become unreliable – in particular when switching between
    development setups and/or production servers. This is why output buffering is
    widely considered just a crutch / strictly a workaround.

    See also the basic usage example
    in the manual, and for more pros and cons:

    • What is output buffering in PHP?
    • Why use output buffering in PHP?
    • Is using output buffering considered a bad practice?
    • Use case for output buffering as the correct solution to "headers already sent"

    But it worked on the other server!?

    If you didn’t get the headers warning before, then the output buffering
    php.ini setting

    has changed. It’s likely unconfigured on the current/new server.

    Checking with headers_sent()

    You can always use headers_sent() to probe if
    it’s still possible to… send headers. Which is useful to conditionally print
    info or apply other fallback logic.

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

    Useful fallback workarounds are:

    • HTML <meta> tag

      If your application is structurally hard to fix, then an easy (but
      somewhat unprofessional) way to allow redirects is injecting a HTML
      <meta> tag. A redirect can be achieved with:

       <meta http-equiv="Location" content="http://example.com/">
      

      Or with a short delay:

       <meta http-equiv="Refresh" content="2; url=../target.html">
      

      This leads to non-valid HTML when utilized past the <head> section.
      Most browsers still accept it.

    • JavaScript redirect

      As alternative a JavaScript redirect
      can be used for page redirects:

       <script> location.replace("target.html"); </script>
      

      While this is often more HTML compliant than the <meta> workaround,
      it incurs a reliance on JavaScript-capable clients.

    Both approaches however make acceptable fallbacks when genuine HTTP header()
    calls fail. Ideally you’d always combine this with a user-friendly message and
    clickable link as last resort. (Which for instance is what the http_redirect()
    PECL extension does.)

    Why setcookie() and session_start() are also affected

    Both setcookie() and session_start() need to send a Set-Cookie: HTTP header.
    The same conditions therefore apply, and similar error messages will be generated
    for premature output situations.

    (Of course, they’re furthermore affected by disabled cookies in the browser
    or even proxy issues. The session functionality obviously also depends on free
    disk space and other php.ini settings, etc.)

    Further links

    • Google provides a lengthy list of similar discussions.
    • And of course many specific cases have been covered on Stack Overflow as well.
    • The WordPress FAQ explains How do I solve the Headers already sent warning problem? in a generic manner.
    • Adobe Community: PHP development: why redirects don’t work (headers already sent)
    • Nucleus FAQ: What does "page headers already sent" mean?
    • One of the more thorough explanations is HTTP Headers and the PHP header() Function – A tutorial by NicholasSolutions (Internet Archive link).
      It covers HTTP in detail and gives a few guidelines for rewriting scripts.
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I am getting following error while running local script/server of my Rails project: This
We were running Tarantino in a Nant build script but we're getting some new
I'm using this script: import serial ser = serial.Serial('/dev/ttyUSB0') print 'Running..' while True: a=ser.read()
Running this script in a django shell: import processors.topics.tasks as t t.test.delay() Gives this
Can anyone assist me in getting a Python script running on Hostgator Shared hosting?
Stop running this script? A script on this page is causing Internet Explorer to
Perl Question . I'm trying to get this script running in a debugger. I've
I know this will seem like a dumb question but I'm just getting started
I'm having a little issue getting quite a simple bash script running. The part
I am running ruby script/generate scaffold or ruby script/generate model and I know the

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.