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
)
*/
?>
不怎麼建議這樣做
等資料都處理完畢
確定都沒有問題了以後
再決定網頁輸出或是重新導向
應該會比較好一點
嗯, 這樣子說也沒錯.
不過另外, 出問題寫 error log, 每天去注意一下 error log, 這樣子線上有問題的, 就可以比較早追出問題, 不然有時後是上線後, 這個問題沒有測到, 但是 User 又沒有反應的話, 反而系統有問題被發現的時間就很久了.
這個函數可以加入幾秒後跳轉頁面嗎
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網頁會出現錯誤,麻煩指導一下,謝謝
你可以在 header() 之前,sleep(10); 就可以了...