大家常看到的 錯誤碼 “Warning: Cannot send session cookie - headers already sent...”或者“Cannot add/modify header information - headers already sent...”
1. 何謂 HEADER :
請參考這篇文章
http://bbs.ecstart.com/viewthrea ... 1%AA%BA%A8%CF%A5%CE
而 PHP 中 SET_COOIE 和 SESSION_START 上方 通常都是不準許 ECHO 出 字串的
原因是因為 它們不容許 在插入 HEADER (表頭) 內容時 , 程式出現 了 HTML 或 空白 或其它字元 .
2. 如何知道 執行 SET_COOKIE 和 SESSION_START 時 出現了 HEADER 以為的語法 :
請參考這篇文章 :
http://tw.php.net/manual/en/function.headers-sent.php
3. 解決方案 :
A. 從程式裡把出現在header前的字元拿掉 ( 慢慢找 )
B. ob_start() << 利用 OB_START ....
簡單的說 OB_START 就是將 要吐出來的內容 先放到記憶體 等記憶體放滿了才會吐出來 .
所以 它會將預吐出來的資料先放入 BUFFER 等 BUFFER 滿了 才會一口氣吐出來 , 這樣就可以避免 HEADER 中間被插入其它字串或字元.
這個解法上述有人提過了 ,
但是你好像還會發生 , 所以我在猜 , 還沒有進入 PHP BUFFER 的控制前 就有東西吐出來了 .
所以上述也有人提到 可能是 BOM 或是 APACHE 本身不知吐了什麼東西出來.
到此都只是猜測...
詳細 OB_START 介紹 : http://bbs.ecstart.com/viewthrea ... ob%5C_start%2BFIEND
C. 將 php.ini 的 output_buffering 改成 : ( BUFFER 上述己跟大家介紹過觀念這裡不多加描述 ); Output buffering allows you to send header lines (including cookies) even
; after you send body content, at the price of slowing PHP's output layer a
; bit. You can enable output buffering during runtime by calling the output
; buffering functions. You can also enable output buffering for all files by
; setting this directive to On. If you wish to limit the size of the buffer
; to a certain size - you can use a maximum number of bytes instead of 'On', as
; a value for this directive (e.g., output_buffering=4096).
output_buffering = 4096
複製代碼D. 直接改 HTTPD SERVER :
AllowOverride All
如果你是租 主機 ... 在 .htaccess 內加入 :
AllowOverride All
PHP_FLAG output_buffering On
###############################
上述資料出處:
http://bbs.ecstart.com/thread-30347-1-4.html
沒有留言:
張貼留言