Не очевидная проблема с простым решением. [RuntimeException] Could not start session because headers have already been sent.

116 прочитали
 На одном из проектов стала возникать ошибка со следующим содержимым [RuntimeException] Could not start session because headers have already been sent. "/var/www/html/file_test.php":1.

На одном из проектов стала возникать ошибка со следующим содержимым

[RuntimeException] Could not start session because headers have already been sent. "/var/www/html/file_test.php":1. (0)
/var/www/html/bitrix/modules/main/lib/session/session.php:144
#0: Bitrix\Main\Session\Session->start()
/var/www/html/bitrix/modules/main/lib/session/kernelsessionproxy.php:47
#1: Bitrix\Main\Session\KernelSessionProxy->start()
/var/www/html/bitrix/modules/main/include.php:168
#2: require_once(string)
/var/www/html/bitrix/modules/main/include/prolog_before.php:19
#3: require(string)
/var/www/html/file_test.php:5

Судя по сообению, нужно выяснить какие отправлены заголовки, и сделать это можно так

headers_sent($filename, $linenum);
var_dump( headers_list(), $filename, $linenum);

В результате в переменны $filename, $linenum будет информация в каком файле и на какой строчке эти заголовки были отправлены

И самое интересное - так может содержаться следующий текст

array(2) { [0]=> string(24) "X-Powered-By: PHP/8.1.27" [1]=> string(38) "Content-type: text/html; charset=utf-8" } string(44) "/var/www/html/file_test.php" int(1)

То есть заголовок размежен в вызываемом файле, на первой строчке, при этом соедержимое файла

<?php
headers_sent($filename, $linenum);
var_dump( headers_list(), $filename, $linenum);
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
//...

Решение

1. В процессе выяснилось что ошибка [RuntimeException] Could ... возникает именно из за заголовка Content-Type.

И в данном случае этот заголовок формирвоался автоматически из-за того, что кодировка файлы была UTF-8 with BOM. То есть причина была в маркере последовательсности байтов (BOM)

Удаление маркера, или приведение файла к кодировке UTF-8 без BOM, решило проблему

2. Заголовок X-Powered-By никак не влияет на появление ошибки, но если кому-то понадобиться, отключить его можно в php.ini

expose_php = Off