Sunday, March 16, 2008

Cảnh báo “headers already sent by” khi lập trình PHP

"headers" là gì?

Mỗi khi server trả về thông tin cho browser, luôn luôn có một số thông tin đính kèm ở đầu của gói dữ liệu. Đó là "headers". Ví dụ:
Code:
HTTP/1.1 200 OK
Date: Wed, 08 Feb 2006 08:20:07 GMT
Server: Apache/2.0.54 (Debian GNU/Linux) mod_auth_pgsql/2.0.2b1 mod_ssl/2.0.54 OpenSSL/0.9.7e
X-Powered-By: PHP/4.4.0
Transfer-Encoding: chunked
Content-Type: text/html
Những thông tin này dùng để điều khiển browser cho một số chức năng như caching, kiểu dữ liệu, encoding,... Nếu bạn muốn biết thêm về cách sử dụng các thông tin trong header, bạn có thể tham khảo ở đây:
http://www.expertsrt.com/tutorials/Matt/HTTP_headers.html

Nguyên nhân xuất hiện cảnh báo "headers already sent by"

Đôi khi bạn nhận được một cảnh báo như sau: “… headers already sent by”. Trong liên kết ở trên cũng có đề cập đến lỗi này. Cảnh báo trên xuất hiện khi bạn gọi hàm header() hoặc session_start() sau khi gửi về browser nội dung của page. Nội dung gửi về cho browser bao gồm việc bạn gọi hàm echo, print, hoặc tất cả những gì ở ngoài cặp server tag . Chú ý: headers phải được gửi trước khi có bất kỳ một nội dung nào trả về cho browser.

Nhưng tôi không xuất bất cứ nội dung nào về cho browser trước khi gọi những hàm đó, tại sao cảnh báo đó vẫn xuất hiện?

Đây là một lỗi phổ biến của các lập trình viên PHP. Như đã đề cập ở trên, nội dung gửi về cho browser bao gồm TẤT CẢ những gì ở NGOÀI cặp server tags , kể cả dấu cách, dấu xuống dòng cũng được tính vào đó. Hãy thử kiểm tra lại đoạn code của bạn, có thể bạn đã để sót đâu đó một dấu cách ngay sau tag đóng ?> trong một trong những file php mà bạn include vào.

Ngoài ra, còn một nguyên nhân khác bạn có thể gặp phải. Khi bạn lưu file php với encoding là “UTF-8 with signature” trên hệ điều hành Windows, 3 bytes với hex code “EFBBBF” sẽ được chèn tự động vào đầu file. Những bytes này dùng để cho Windows nhận diện ra file text có nội dung UTF-8. Chúng không cần thiết cho PHP. Trình thông dịch PHP xem chúng như là những ký tự thông thường và gửi về cho browser vì chúng nằm trước tag mở . Hậu quả là những lời gọi hàm header() và session_start() đều bị lỗi. Nếu bạn dùng Zend Studio, hãy chọn Encoding là “UTF-8 without signature” khi lưu xuống.

(http://ltvan.wordpress.com/2007/05/2...ready-sent-by/)

No comments:

Post a Comment