Lỗi "Warning: Cannot modify header information - headers already sent by..." là một trong những "cơn ác mộng" phổ biến nhưng cũng dễ xử lý nhất khi làm việc với PHP. Lỗi này xảy ra khi script cố gắng gửi một HTTP header (như header(), setcookie(), hoặc session_start()) sau khi dữ liệu thực tế (HTML, khoảng trắng, hoặc văn bản) đã được gửi đến trình duyệt.
Dưới đây là cách khắc phục lỗi này một cách chuyên nghiệp và hiệu quả hơn.
Cách 1: Kiểm tra khoảng trắng và định dạng file (Cơ bản)
Đây là nguyên nhân thường gặp nhất sau khi chỉnh sửa code hoặc di chuyển dữ liệu.
Khoảng trắng thừa: Kiểm tra xem có khoảng trắng nào nằm trước thẻ mở <?php hoặc sau thẻ đóng ?> không. Thậm chí chỉ một dòng trống cũng khiến PHP hiểu là "nội dung" và gửi nó đi trước, gây lỗi header.
Định dạng Encoding: Đảm bảo file PHP được lưu ở định dạng UTF-8 without BOM. Các file lưu dưới dạng UTF-8 (có BOM) sẽ chứa các ký tự ẩn ở đầu file, gây ra lỗi ngay lập tức. Bạn nên dùng Notepad++ hoặc VS Code để chuyển đổi (Encoding -> Convert to UTF-8 without BOM).
Cách 2: Sử dụng Output Buffering
Nếu bạn không thể tìm ra vị trí gây lỗi trong một hệ thống lớn, hãy sử dụng cơ chế bộ đệm đầu ra để "giữ chân" dữ liệu lại cho đến khi toàn bộ script được xử lý xong.
Thêm hàm ob_start(); vào ngay dòng đầu tiên của file (thường là file cấu hình hoặc file index.php).
Thêm hàm ob_end_flush(); ở cuối cùng của file.
Mẹo quản trị: Nếu bạn có quyền truy cập máy chủ, hãy tìm file php.ini và chuyển output_buffering = Off thành output_buffering = On hoặc một giá trị cụ thể (ví dụ: 4096). Cách này sẽ áp dụng cho toàn bộ website mà không cần sửa từng file.
Cách 3: Kiểm tra các lệnh echo, print hoặc lỗi ẩn
Đôi khi lỗi không đến từ khoảng trắng mà đến từ các câu lệnh xuất dữ liệu sớm:
Lệnh Echo/Print: Đảm bảo không có lệnh nào in dữ liệu ra trước khi các hàm header() hoặc session_start() được thực thi.
Thông báo lỗi ẩn: Nếu PHP của bạn bật chế độ hiển thị lỗi (display_errors = On), một cảnh báo nhỏ (Warning/Notice) xuất hiện trước khi gọi header cũng sẽ kích hoạt lỗi này. Hãy tạm thời tắt hiển thị lỗi để kiểm tra hoặc xử lý triệt để các cảnh báo đó.
Cách 4: Sử dụng JavaScript để chuyển hướng (Giải pháp thay thế)
Nếu bạn đã thử mọi cách nhưng cấu trúc code vẫn gây xung đột khi sử dụng hàm header("Location: ..."), bạn có thể dùng JavaScript để điều hướng thay thế. Cách này bỏ qua các ràng buộc về HTTP header của PHP.