Warning: Cannot modify header information - headers already sent......(PHP頁面跳轉的問題)

昨晚在轉換許願板編碼的時候,有一個頁面需要在head中申明utf-8的編碼,但是這與程序中的一處header產生了衝突。google了一下,找到幾種解決方法,翻譯整理一下:

If you got this message: "Warning: Cannot modify header information - headers already sent by ...."
如果在執行php程序時看到這條警告:"Warning: Cannot modify header information - headers already sent by ...."

Few notes based on the following user posts:
有以下幾種解決方法:


1. Blank lines (空白行):
Make sure no blank line after <?php ... ?> of the calling php script.
檢查有<?php ... ?> 後面沒有空白行,特別是include或者require的文件。不少問題是這些空白行導致的。


2. Use exit statement (用exit來解決):
Use exit after header statement seems to help some people
在header後加上exit();
header ("Location: xxx");
exit();


3. PHP has this annoying problem, if your HTML goes before any PHP code or any header modification before redirecting to certain page, it'll said "Warning: Cannot modify header information - headers already sent by ...." Basically anytime you output to browser, the header is set and cannot be modified.   So two ways to get around the problem:


3a. Use Javascript (用Javascript來解決):
<? echo "<script> self.location(/"file.php/");</script>"; ?>
Since it's a script, it won't modify the header until execution of Javascript.
可以用Javascript來代替header。但是上面的這段代碼我沒有執行成功... 另外需要注意,採用這種方法需要瀏覽器支持Javascript.


3b. Use output buffering (用輸出緩存來解決):
<?php ob_start(); ?>
... HTML codes ...
<?php
... PHP codes ...
header ("Location: ....");
ob_end_flush();
?>
This will save the output buffer on server and not output to browser yet, which means you can modify the header all you want until the ob_end_flush() statement.   This method is cleaner than the Javascript since Javascript method assumes the browser has Javascript turn on.   However, there are overhead to store output buffer on server before output, but with modern hardware I would imagine it won't be that big of deal.   Javascript solution would be better if you know for sure your user has Javascript turn on on their browser.

就像上面的代碼那樣,這種方法在生成頁面的時候緩存,這樣就允許在輸出head之後再輸出header了。本站的許願板就是採用這種方法解決的header問題。


4.set output_buffering = On in php.ini (開啓php.ini中的output_buffering )
set output_buffering = On will enable output buffering for all files. But this method may slow down your php output. The performance of this method depends on which Web server you're working with, and what kind of scripts you're using.
這種方法和3b的方法理論上是一樣的。但是這種方法開啓了所有php程序的輸出緩存,這樣做可能影響php執行效率,這取決於服務器的性能和代碼的複雜度。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章