PHP錯誤:Warning: Cannot modify header information
如果在執行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 scrīpt.
檢查有<?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 Javascrīpt (用Javascrīpt來解決):
<? echo "<scrīpt> self.location( file.php );</scrīpt>"; ?>
Since it s a scrīpt, it won t modify the header until execution of Javascrīpt.
可以用Javascrīpt來代替header。另外需要注意,採用這種方法需要瀏覽器支援Javascrīpt.
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 Javascrīpt since Javascrīpt method assumes the browser has Javascrīpt 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. Javascrīpt solution would be better if you know for sure your user has Javascrīpt 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 scrīpts you re using.
這種方法和3b的方法理論上是一樣的。但是這種方法開啟了所有php程式的輸出快取,這樣做可能影響php執行效率,這取決於伺服器的效能和程式碼的複雜度。
第二種:
如何徹底杜絕warning: Cannot add header information - headers already sent in…… 這種令人莫明其妙的的錯誤。 只要你寫過PHP程式碼,相信都遇上過這個大多時候都令人莫明其妙的warning吧..今天我們就來搞定它…………… 看了PHP手冊,回答如下:訊息“Warning: Cannot send session cookie - headers already sent…”或者“Cannot add/modify header information - headers already sent…”。 函式 header(),setcookie() 和 session 函式需要在輸出流中增加頭資訊。但是頭資訊只能在其它任何輸出內容之前傳送。在使用這些函式前不能有任何(如 HTML)的輸出。函式 headers_sent() 能夠檢查您的指令碼是否已經發送了頭資訊。請參閱“輸出控制函式”。 意思是:不要在使用上面的函式前有任何文字,空行,回車,空格等。但。。。問題是,這答案並不令人滿意。因為往往程式在其他PHP環境下執行卻正常。 首先:這錯誤是怎麼產生的呢?讓我們來看看PHP是如何處理HTTP header輸出和主體輸
文討論的是如何徹底杜絕warning: Cannot add header information - headers already sent in…… 這種令人莫明其妙的的錯誤。
只要你寫過PHP程式碼,相信都遇上過這個大多時候都令人莫明其妙的warning吧..今天我們就來搞定它……………
看了PHP手冊,回答如下:
訊息“Warning: Cannot send session cookie - headers already sent…”或者“Cannot add/modify header information - headers already sent…”。
函式 header(),setcookie() 和 session 函式需要在輸出流中增加頭資訊。但是頭資訊只能在其它任何輸出內容之前傳送。在使用這些函式前不能有任何(如 HTML)的輸出。函式 headers_sent() 能夠檢查您的指令碼是否已經發送了頭資訊。請參閱“輸出控制函式”。
意思是:不要在使用上面的函式前有任何文字,空行,回車,空格等。但。。。問題是,這答案並不令人滿意。因為往往程式在其他PHP環境下執行卻正常。
首先:這錯誤是怎麼產生的呢?讓我們來看看PHP是如何處理HTTP header輸出和主體輸出的。
PHP指令碼開始執行時,它可以同時傳送header(標題)資訊和主體資訊。 Header資訊(來自 header() 或 SetCookie() 函式)並不會立即傳送,相反,它被儲存到一個列表中。 這樣就可以允許你修改標題資訊,包括預設的標題(例如 Content-Type 標題)。但是,一旦指令碼傳送了任何非標題的輸出(例如,使用 HTML 或 print() 呼叫),那麼PHP就必須先發送完所有的Header,然後終止 HTTP header。而後繼續傳送主體資料。從這時開始,任何新增或修改Header資訊的試圖都是不允許的,並會發送上述的錯誤訊息之一。
好!那我們來解決它:笨方法:把錯誤警告全不顯示! 掩耳盜鈴之計
error_reporting(E_ERROR | E_PARSE); 這裡不要顯示E_WARNING即可
解決方案:
1)適用於有許可權編輯PHP。INI的人
開啟php。ini檔案(你應試比我清楚你的php。ini在哪裡),找到
output_buffering =改為on或者任何數字。如果是IIS6,請一定改為ON,不然你的PHP效率會奇慢。
2)使用虛擬主機,不能編輯PHP。INI,怎麼辦?
簡單:
在你的空間根目錄下建立一個。htaccess檔案,內容如下:
AllowOverride All
PHP_FLAG output_buffering On
不幸的情況是:還是不行?全部網頁都不能顯示啦?
那麼,再用下面的方法:
在PHP檔案的最開始加入:ini_set("output_buffering", "1");
讓這個頁面開啟PHP的輸出快取。
3)在PHP檔案裡解決
ob_start()
啟用output buffering機制。 Output buffering支援多層次 — 例如,可以多次呼叫 ob_start() 函式。
ob_end_flush()
傳送output buffer(輸出緩衝)並禁用output buffering機制。
ob_end_clean()
清除output buffer但不傳送,並禁用output buffering。
ob_get_contents()
將當前的output buffer返回成一個字串。允許你處理指令碼發出的任何輸出。
原理:
output_buffering被啟用時,在指令碼傳送輸出時,PHP並不傳送HTTP header。相反,它將此輸出通過管道(pipe)輸入到動態增加的快取中(只能在PHP 4。0中使用,它具有中央化的輸出機制)。你仍然可以修改/新增header,或者設定cookie,因為header實際上並沒有傳送。當全部指令碼終止時,PHP將自動傳送HTTP header到瀏覽器,然後再發送輸出緩衝中的內容。
4)絕殺技巧
如果以上方法都不能等到滿意的解決辦法,請用如下辦法:
先用記事本打開出現問題的網頁,另存為ANSI編碼的同名檔案。
再用EditPlus將該檔案另存為UTF-8編碼的檔案。
再試試,應該可以顯示了。
造成的原因主要由以下兩點:
一:在Header()函式之間輸出了其他內容(一般由瀏覽器隱藏傳送),導致了後來的Header不能再次傳送新的頁面型別。這可以通過開啟Output_Buffering來解決,方法2)與3)就是這樣。
二:PHP檔案採用UTF-8編碼,由於編碼不相容(特別是通過其他編碼轉換過來的),產生了BOM《在UCS 編碼中有一個叫做"ZERO WIDTH NO-BREAK SPACE"的字元,它的編碼是FEFF。而FFFE在UCS中是不存在的字元,所以不應該出現在實際傳輸中。UCS規範建議我們在傳輸位元組流前,先傳輸 字元"ZERO WIDTH NO-BREAK SPACE"。這樣如果接收者收到FEFF,就表明這個位元組流是Big-Endian的;如果收到FFFE,就表明這個位元組流是Little- Endian的。因此字元"ZERO WIDTH NO-BREAK SPACE"又被稱作BOM。
UTF-8不需要BOM來表明位元組順序,但可以用BOM來表明編碼方式。字元"ZERO WIDTH NO-BREAK SPACE"的UTF-8編碼是EF BB BF。所以如果接收者收到以EF BB BF開頭的位元組流,就知道這是UTF-8編碼了。
Windows就是使用BOM來標記文字檔案的編碼方式的。》導致了的標頭檔案不能正確識別,這時只要去除UTF-8檔案中的BOM就可以了,方法4)就是基於這種原理的。
出的。 PHP指令碼開始執行時,它可以同時傳送header(標題)資訊和主體資訊。 Header資訊(來自 header() 或 SetCookie() 函式)並不會立即傳送,相反,它被儲存到一個列表中。 這樣就可以允許你修改標題資訊,包括預設的標題(例如 Content-Type 標題)。但是,一旦指令碼傳送了任何非標題的輸出(例如,使用 HTML 或 print() 呼叫),那麼PHP就必須先發送完所有的Header,然後終止 HTTP header。而後繼續傳送主體資料。從這時開始,任何新增或修改Header資訊的試圖都是不允許的,並會發送上述的錯誤訊息之一。 好!那我們來解決它:笨方法:把錯誤警告全不顯示! 掩耳盜鈴之計 error_reporting(E_ERROR | E_PARSE); 這裡不要顯示E_WARNING即可 解決方案: 1)適用於有許可權編輯PHP。INI的人開啟php。ini檔案(你應試比我清楚你的php。ini在哪裡),找到 output_buffering =改為on或者任何數字。如果是IIS6,請一定改為ON,不然你的PHP效率會奇慢。 2)使用虛擬主機,不能編輯PHP。INI,怎麼辦? 簡單:在你的空間根目錄下建立一個。htaccess檔案,內容如下: AllowOverride All PHP_FLAG output_buffering On 不幸的情況是:還是不行?全部網頁都不能顯示啦? 那麼,再用下面的方法: 在PHP檔案的最開始加入:ini_set("output_buffering", "1"); 讓這個頁面開啟PHP的輸出快取。 3)在PHP檔案裡解決 ob_start() 啟用output buffering機制。 Output buffering支援多層次 — 例如,可以多次呼叫 ob_start() 函式。 ob_end_flush() 傳送output buffer(輸出緩衝)並禁用output buffering機制。 ob_end_clean() 清除output buffer但不傳送,並禁用output buffering。 ob_get_contents() 將當前的output buffer返回成一個字串。允許你處理指令碼發出的任何輸出。 原理: output_buffering被啟用時,在指令碼傳送輸出時,PHP並不傳送HTTP header。相反,它將此輸出通過管道(pipe)輸入到動態增加的快取中(只能在PHP 4。0中使用,它具有中央化的輸出機制)。你仍然可以修改/新增header,或者設定cookie,因為header實際上並沒有傳送。當全部指令碼終止時,PHP將自動傳送HTTP header到瀏覽器,然後再發送輸出緩衝中的內容。 4)絕殺技巧 如果以上方法都不能等到滿意的解決辦法,請用如下辦法: 先用記事本打開出現問題的網頁,另存為ANSI編碼的同名檔案。 再用EditPlus將該檔案另存為UTF-8編碼的檔案。 再試試,應該可以顯示了。 造成的原因主要由以下兩點: 一:在Header()函式之間輸出了其他內容(一般由瀏覽器隱藏傳送),導致了後來的Header不能再次傳送新的頁面型別。這可以通過開啟Output_Buffering來解決,方法2)與3)就是這樣。 二:PHP檔案採用UTF-8編碼,由於編碼不相容(特別是通過其他編碼轉換過來的),產生了BOM《在UCS 編碼中有一個叫做"ZERO WIDTH NO-BREAK SPACE"的字元,它的編碼是FEFF。而FFFE在UCS中是不存在的字元,所以不應該出現在實際傳輸中。UCS規範建議我們在傳輸位元組流前,先傳輸 字元"ZERO WIDTH NO-BREAK SPACE"。這樣如果接收者收到FEFF,就表明這個位元組流是Big-Endian的;如果收到FFFE,就表明這個位元組流是Little- Endian的。因此字元"ZERO WIDTH NO-BREAK SPACE"又被稱作BOM。 UTF-8不需要BOM來表明位元組順序,但可以用BOM來表明編碼方式。字元"ZERO WIDTH NO-BREAK SPACE"的UTF-8編碼是EF BB BF。所以如果接收者收到以EF BB BF開頭的位元組流,就知道這是UTF-8編碼了。 Windows就是使用BOM來標記文字檔案的編碼方式的。》導致了的標頭檔案不能正確識別,這時只要去除UTF-8檔案中的BOM就可以了,方法4)就是基於這種原理的。
相關推薦
PHP錯誤:Warning: Cannot modify header information
如果在執行php程式時看到這條警告:"Warning: Cannot modify header information - headers already sent by ...." Few notes based on the following user posts:有
php 解決Warning: Cannot modify header information
環境:mac問題:瀏覽器出現 Warning: Cannot modify header information - headers already sent by...問題原因:函式 header()
php5.6,Ajax報錯,Warning: Cannot modify header information - headers already sent in Unknown on line 0
ont line span use -s nbsp ati bsp data php5.6ajax報錯 Deprecated: Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be r
Warning: Cannot modify header information的解決辦法
昨天將本站的wordpress升級到最新版本,今天早上,經過兩位朋友的提醒,才發現用非chrome瀏覽器開啟部落格,頭部會顯示有錯誤,錯誤內容為: Warning: Cannot modify header information – headers already sent by (output
ajax 上傳檔案 報錯 Warning: Cannot modify header information - headers already sent in Unknown on line 0
在使用ajax更新或上傳資料的時候,return回來的卻是一堆錯誤 後來才知道原來是PHP5.6有的功能已經廢棄了,所以我需要開啟PHP.ini檔案,找到 ;always_populate_raw_post_data = -1 將前面的分號去掉 always_popula
解決Warning: Cannot modify header information
資訊的時候經常提示:cannot modify header information - headers already sent by (......)。其實已經實現需要的效果了,就是這個錯誤資訊看著不爽,網上找了很多辦法,綜合使用得到的解決方法是 1在頁面頂部的php標籤
PHP經典header錯誤"Cannot modify header information"的解決方法(轉)
錯誤提 示:Cannot modify header information - headers already sent by .... 昨晚在轉換編碼的時候,有一個 頁面需要在head中申明utf-8的編碼,但是這與程式中的一處header產生了衝突。google了一下,找到幾種解決方法,翻譯整
PHP提示Cannot modify header information - headers already sent by解決方法
PHP提示Cannot modify header information - headers already sent by解決方法 因為 header();傳送頭之前不能有任何輸出,空格也不行, 需要將header()之前的空格去掉,或者其他輸出的東西去掉, 如果他上面include其他檔案了,你還
php錯誤:Warning: mkdir(): No such file or directory
Warning: mkdir(): No such file or directory if(!is_dir(‘customimages/album/’.KaTeX parse error: Expected '}', got 'EOF' at end of input: …images/a
錯誤:XMLHttpRequest cannot load
ces req pre 本地 原因 target cto chrome瀏覽器 from 原因:Chrome瀏覽器不支持本地ajax訪問,具體就是ajax不能訪問file 有3種解決辦法:http://frabbit2013.blog.51cto.com/1067958/1
PHP錯誤:SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client
升級 文件中 sta 否支持 sha2 authent lte 子句 bubuko 使用PHP連接MySQL 8的時候,可能會發生如標題所示的錯誤: SQLSTATE[HY000] [2054] The server requested authentication me
Linux錯誤:warning: here-document at line 5 delimited by end-of-file (wanted `EOF`
shell 指令碼執行‘warning’: 執行此test.shell報如下錯: warning: here-document at line 17 delimited by end-of-file (wanted `EOF') 原因是末尾的EOF後面帶有空格,EOF前
NodeJs錯誤:TypeError: Cannot read property 'path' of undefined
情景重現: 錯誤程式碼: function upload(response, request){ console.log("Request handler 'upload' was called."); var form = new formidable.Incom
TS/JS錯誤:TypeError: Cannot read property 'prototype' of undefined
總結一下解決這個錯誤的引起和過程。 錯誤資訊:TypeError: Cannot read property ‘prototype’ of undefined 開發語言:TypeScript 編譯後語言:JavaScript 開發工具:LayaAir
字符集不同引發的MySQL的1366錯誤:Warning: #1366 Incorrect string value...
今天在phpMyAdmin新建了一個數據庫:news,news裡有一個表:newslist。在向表中插入中文資料時出現了錯誤,錯誤如下圖: 點選“瀏覽”,表中title項出現一系列“?”號,如下圖: 這個錯誤是MySQL的1366錯誤,導致此錯誤的原因是:資料庫此欄位
PHP錯誤:call to undefined function imagecreatetruecolor
在使用php進行繪圖的過程中,出現“call to undefined function imagecreatetruecolor”錯誤。 可能的原因是沒有安裝php5-gd <?php
php安裝擴充套件錯誤:Cannot find config.m4. Make sure that you run /usr/local/bin/phpize in the top level sourc
如果在安裝php擴充套件的時候出現如題的錯誤:只需到php的安裝目錄下如:cd /usr/local/php/php-7.0.4/ext/openssl 執行命令: cp ./config0.m4
Nginx錯誤:nginx: [error] OpenEvent("Global gx_reload_6252") failed (2: The system cannot find the file specified)
導致 microsoft style cif not nginx錯誤 開啟 family mic 執行nginx -s reload命令: nginx: [error] OpenEvent("Global\ngx_reload_6252") failed (2: The
yum源安裝故障:warning: rpmts_HdrFromFdno: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
nokey public key 一:操作:用yum安裝pssh服務:[[email protected] ~]# yum install pssh二:故障信息:warning: rpmts_HdrFromFdno: Header V3 RSA/SHA256 Signature, key
錯誤:php70w-common conflicts with php-common-5.3.3-4
phpize php-common 博客原文地址https://xgs888.top/post/view?id=43錯誤:php70w-common conflicts with php-common-5.3.3-49.el6.x86_64 You could try using --skip-bro