Сегодня я покажу вам простой способ, как разрулить хардкорный баг с session_start() в PHP.
Недавно один подписчик столкнулся с ситуацией: скрипт падает с ошибкой "Cannot send session cache limiter - headers already sent". Думаю, каждый второй PHP-разработчик хотя бы раз в жизни это видел.
Разбираемся.
💥 Причина
Ошибка возникает, когда session_start()
вызывается после того, как браузеру уже отправлены заголовки. В PHP это означает — где-то до session_start()
был echo
, пробел вне тегов <?php ?>
, или даже var_dump()
для отладки. Любой вывод в браузер = PHP уже отправил заголовки. А session_start()
хочет их изменить — и ловим ошибку.
✅ Как лечить
1. Ищем вывод до session_start()
- Проверь, нет ли echo
, print
, отладочных функций или лишних символов до вызова session_start()
.
- Включи буферизацию ob_start()
в начале скрипта — поможет временно «глотать» вывод:
ob_start();
session_start();
Но это костыль. Лучше всё же вычистить лишний вывод.
2. Идеальная структура файла
<?php
// Никакого вывода до этого места!
session_start();
// Весь остальной код
?>
3. Ищи BOM
Иногда редакторы типа Notepad++ добавляют невидимый символ BOM в начало файла. Он тоже считается выводом. Решается сохранением файла в UTF-8 без BOM.
🛠 Мой способ отладки
Когда всё выглядит правильно, но ошибка всё равно есть:
- Создай новый чистый файл, вставь туда
session_start()
— если работает, значит проблема в другом коде.- Используй
headers_sent()
:
if (headers_sent($file, $line)) {
echo "Вывод уже начат в $file на строке $line";
}
Это сэкономило мне кучу времени при отладке старых легаси-проектов.
👉 @php_lib
>>Click here to continue<<