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
)
*/
?>

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

在〈PHP 判斷 Header 送出前, 是否有值被送出去: headers_sent()〉中有 4 則留言

  1. 不怎麼建議這樣做
    等資料都處理完畢
    確定都沒有問題了以後
    再決定網頁輸出或是重新導向
    應該會比較好一點

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

  3. 這個函數可以加入幾秒後跳轉頁面嗎
    if(!headers_sent()){
    header(refresh:10;"Location: http://www.google.com/");

    exit();
    } else {
    echo 'Wanted to redirect you but I could not do it!';
    }

    我加了refresh:10網頁會出現錯誤,麻煩指導一下,謝謝

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料