星期三, 九月 24, 2008

PHP 判斷 Header 送出前, 是否有值被送出去: headers_sent()

header() 最常被拿來送 header('Location: /'); 等等, 做網頁導向的動作.

除了這些動作外, 還有 setcookie(), header()... 等, 這些 function 在執行前, 頁面上都不能有任何輸出(空白也不行), 若有任何輸出, 就會有下述的錯誤訊息:

<b>Warning</b>:  Cannot modify header information - headers already sent by (output started at /var/www/test.php:5) in <b>/var/www/test.php</b> on line <b>6</b><br />

要預防這種錯誤發生, 可以使用 headers_sent() 判斷, 若之前已經有輸出, 就寫個 Log 檔會其它處理, 不要讓錯誤訊息直接秀在頁面上~:)

headers_sent() 範例

<?php
// 如果之前沒有任何輸出, 就送出 Location 的導向資訊
if (!headers_sent()) {
    header('Location: b.php');
    exit;
}
?>

另外要秀出 預計要送哪些 header 的資訊出去, 可以使用 headers_list() 查看.

headers_list() 範例

<?php
setcookie('abc', 'test');
header('Content-type: text/plain');

// headers_list() 會將預計要送的 header data 轉成 Array 回傳
print_r(headers_list());
/*
Array
(
    [0] => X-Powered-By: PHP/5.2.6-3
    [1] => Set-Cookie: abc=test
    [2] => Content-type: text/plain
)
*/
?>
相關標籤

this is comment icon [回覆]

不怎麼建議這樣做

等資料都處理完畢
確定都沒有問題了以後
再決定網頁輸出或是重新導向
應該會比較好一點

Comment by 日落 (09/24/2008 12:30)

this is comment icon 回 日落 [回覆]

嗯, 這樣子說也沒錯.
不過另外, 出問題寫 error log, 每天去注意一下 error log, 這樣子線上有問題的, 就可以比較早追出問題, 不然有時後是上線後, 這個問題沒有測到, 但是 User 又沒有反應的話, 反而系統有問題被發現的時間就很久了.

Comment by Tsung (09/24/2008 17:44)
Add this page to del.icio.us

發表迴響

標題

內容 (限制 1000 字)

暱稱

電子郵件

個人網頁


 authimage


PS: 若無法留言, 請先確認是否有打開 JavaScript, 造成您的困擾, 實在萬分對不起 Orz...(如果無法留言, 勞煩可以發信給我好嗎? 謝謝.)
PS2: 若您的留言被誤判, 我都會再自行看過, 不需要一直重覆張貼~