Overview
If you’re a PHP developer, you might have come across the warning ‘Cannot modify header information – headers already sent,’ a common issue that often baffles newcomers and seasoned developers alike. This warning is triggered when your PHP script tries to send a header to the client after any output has been already sent.
This tutorial provides a comprehensive walkthrough for fixing the ‘headers already sent’ warning in PHP.
Understanding the Problem
Headers in PHP need to be sent to the browser before any kind of output is sent. The output can be HTML, plain text, or even whitespace; any output before the header function calls will trigger the warning, as per the HTTP protocol you cannot modify headers after output has started.
Common Causes:
- Printing or echoing output before calling header functions.
- Whitespace or newlines before PHP opening tags
<?php
or after closing tags?>
. - UTF-8 byte-order mark (BOM) at the beginning of the file.
- Inclusion of files that output something.
- Incorrectly closed PHP tags or forgotten inline HTML.
Diagnosing the Issue
To diagnose the error, start by looking at the error message itself. It will tell you the file and the line number where the output started:
Warning: Cannot modify header information - headers already sent by (output started at /path/to/php/file.php:2) in /path/to/php/file.php on line 10
Go to the specified file and line to see what might be sending the output.
Fixing the Issue
Eliminate Whitespace and BOM
Ensure there is no whitespace before <?php
and after ?>
. If your text editor supports it, enable the setting to remove the BOM.
// Incorrect:
?>
<?php
// Correct:
<?php
Avoid Premature Output
Avoid echoing or printing data before calling header functions. Use output buffering if necessary. Start output buffering at the beginning of your script with ob_start()
and end it with ob_end_flush()
.
<?php
ob_start();
// your code
echo 'Hello, World!';
header('Location: http://www.example.com');
ob_end_flush();
?>
Inclusion of Files
Make sure any files you include do not send output. Double-check included scripts for whitespace, especially at the end of the file.
File Encoding
Save your PHP files with UTF-8 encoding without BOM.
Using Exit
Make sure to call exit()
after sending a header, especially when redirecting. This ensures the script stops executing and does not send any unintended output.
header('Location: http://www.example.com');
exit;
Best Practices
Consistent Code Structure
Organize your code to handle all logic and data processing before output. Manage headers and redirects at the beginning of your scripts.
Removing Closing PHP Tag
In pure PHP files, it’s a common practice to omit the closing PHP tag ?>
to prevent accidental output.
Use Output Buffering
Output buffering can simplify handling of output, although it’s not always the best fix, understanding why output is being sent prematurely is usually more beneficial.
Common Pitfalls
Headers Sent in Included Files
Remember that included or required files are treated as a part of the file that called them. Ensure they do not send headers or output.
Early Session Starts
Calling session_start()
and similar functions also sends headers. Use them cautiously and in the proper location in your script.
Conclusion
Dealing with the ‘headers already sent’ warning in PHP is mostly about understanding the output flow of your PHP files. In development, always keep error reporting at the highest level to catch these issues early by using error_reporting(E_ALL)
and ini_set('display_errors', 1)
.
Adhering to the best practices outlined in this tutorial will not only help you fix the ‘headers already sent’ warning but also improve the overall quality of your PHP projects.