02/10/2018, 18:09

Sửa lỗi Headers Already Sent

Một HTTP response thông thường bao gồm 2 phần là header và content. Phần header trong 1 HTTP response chỉ ra bản chất của response và cách xử lý với chúng. Ví dụ, 1 response có chỉ ra "Location" trong header , cái này báo cho trình duyệt để tự động chuyển đến ...

Một HTTP response thông thường bao gồm 2 phần là header và content. Phần header trong 1 HTTP response chỉ ra bản chất của response và cách xử lý với chúng.

Ví dụ, 1 response có chỉ ra "Location" trong header , cái này báo cho trình duyệt để tự động chuyển đến Url được chỉ ra trong header.Hoặc 1 response có "Content-type" trong header, trình duyệt sẽ xử lý nội dung theo cách khác nhau theo loại nội dung như image, text, Flash,... 

Header cũng được sử dụng khi bạn làm việc với session, có thể bạn ko thấy rõ được điều này, nhưng trong những hàm về session của PHP nó đều dùng thông qua cookie. Vì thế ngay khi bạn dùng session bạn đã tạo ra 1 HTTP header. Hàm session_start() khởi tạo 1 tập cookie và vì thế nó gửi 1 HTTP header xuống trình duyệt. 

Phần còn lại của HTTP response là nội dung (content), cái này chắc bạn nhìn thấy nó dễ dàng rồi. Phần này phải được gửi đi sau headers, và một khi nội dung đã được gửi đi thì sẽ ko có header nào có thể được gửi xuống trình duyệt nữa. Nội dung bao gồm các đoạn mã HTML hoặc bất cứ thứ gì được tạo ra trong script của bạn. Khi bạn gọi echo() bạn đã xuất nội dung xuống trình duyệt rồi đấy. 

Thế thì liên quan gì đến lỗi "Headers Already Sent"? Lỗi này xuất hiện khi bạn cố gắng gửi 1 HTTP header xuống trình duyệt sau khi nội dung đã được gửi xuống. Trong một HTTP response đều này là phạm pháp , ko được phép bởi vì " gạo đã nấu thành cơm" Roll Eyes , trình duyệt đã xử lý xong phần nội dung được gửi xuống rồi, header ko còn tác dụng gì nữa cả . 

Và như tớ đã nói ở trên, session_start() gửi header xuống client, hàm header() cũng gửi header xuống ... vì thế 2 thằng này là dễ gặp lỗi "Headers Already Sent" nhất nếu như đã gửi nội dung xuống trình duyệt trước khi gọi chúng. 

Giải pháp cho vấn đề này đơn giản chỉ là : hãy chắc chắn rằng bạn không gửi bất cứ nội dung gì xuống trình duyệt trước khi gọi các hàm có làm việc với header.Nói thì như thế nhưng thực tế cũng khá khó khăn vì ... chúng ta là người Việt, chúng ta phải viết tiếng Việt trong code , chúng ta phải dùng Unicode ... và đa số các Editor PHP, khi bạn chọn encoding cho file là Utf-8 nó sẽ kèm theo  3 kí tự ở đầu file gọi là BOM (byte order mark). Các kí tự này thuộc dạng vô hình nên chúng ta sẽ ko nhìn thấy chúng , nhưng máy tính thì thấy.... vì thế cho nên bạn có bỏ ra cả tháng trời để ngồi mò mẫm trong code xem có kí tự nào được xuất ra hay chưa thì cũng vô vọng. Cách đơn giản nhất là hãy chọn Utf-8 witthout BOM trong Editor của bạn . 

Nhưng có một giải pháp khác an toàn nhàn nhã hơn là hãy giao tất cả những gì bạn xuất ra cho bộ đệm (output buffering ) nắm giữ, sau khi xử lý xong tất cả sẽ được cho vào đại pháo bắn 1 lần xuống trình duyệt ... không cần lo sau trước thứ tự gì nữa cả . 
Hãy thêm vào đầu code của bạn hàm 
ob_start(); 
và cuối code 
ob_end_flush();
Bình luận
0