Chernichko
@Chernichko
Учусь.

Почему отправляются какие-то заголовки, если использую include_once?

После перехода с php5.6 на php7.2 и обновления версии самого yii до последней
появилась ошибка

An Error occurred while handling another error:
yii\web\HeadersAlreadySentException: Headers already sent in /usr/share/nginx/html/mysite/web/pdf_generator/index2.php on line 1. in /usr/share/nginx/html/mysite/vendor/yiisoft/yii2/web/Response.php:366
Stack trace:
#0 /usr/share/nginx/html/mysite/vendor/yiisoft/yii2/web/Response.php(339): yii\web\Response->sendHeaders()
#1 /usr/share/nginx/html/mysite/vendor/yiisoft/yii2/web/ErrorHandler.php(135): yii\web\Response->send()
#2 /usr/share/nginx/html/mysite/vendor/yiisoft/yii2/base/ErrorHandler.php(111): yii\web\ErrorHandler->renderException(Object(yii\web\HeadersAlreadySentException))
#3 [internal function]: yii\base\ErrorHandler->handleException(Object(yii\web\HeadersAlreadySentException))
#4 {main}
Previous exception:
yii\web\HeadersAlreadySentException: Headers already sent in /usr/share/nginx/html/mysite/web/pdf_generator/index2.php on line 1. in /usr/share/nginx/html/mysite/vendor/yiisoft/yii2/web/Response.php:366
Stack trace:
#0 /usr/share/nginx/html/mysite/vendor/yiisoft/yii2/web/Response.php(339): yii\web\Response->sendHeaders()
#1 /usr/share/nginx/html/mysite/vendor/yiisoft/yii2/base/Application.php(392): yii\web\Response->send()
#2 /usr/share/nginx/html/mysite/web/index.php(14): yii\base\Application->run()
#3 {main}


Контроллер

public function actionPrinttour($code)
{

(...)

include_once('pdf_generator/index2.php');
include_once('pdf_generator/second2.php');
}


Начало файла index2.php

<!DOCTYPE html>
<html>
<head>
 <title></title>
 <meta charset="utf-8" />
 <link href="/pdf_generator/css/styles.pretty2.css" rel="stylesheet" />
</head>


причем на проде ошибка другая

An Error occurred while handling another error:
yii\web\HeadersAlreadySentException: Headers already sent in /var/www/ru.russiadiscovery/web/pdf_generator/second2.php on line 40. in /var/www/ru.russiadiscovery/vendor/yiisoft/yii2/web/Response.php:366
Stack trace:
#0 /var/www/ru.site/vendor/yiisoft/yii2/web/Response.php(339): yii\web\Response->sendHeaders()
#1 /var/www/ru.site/vendor/yiisoft/yii2/web/ErrorHandler.php(135): yii\web\Response->send()
#2 /var/www/ru.site/vendor/yiisoft/yii2/base/ErrorHandler.php(111): yii\web\ErrorHandler->renderException(Object(yii\web\HeadersAlreadySentException))
#3 [internal function]: yii\base\ErrorHandler->handleException(Object(yii\web\HeadersAlreadySentException))
#4 {main}
Previous exception:
yii\web\HeadersAlreadySentException: Headers already sent in /var/www/ru.site/web/pdf_generator/second2.php on line 40. in /var/www/ru.site/vendor/yiisoft/yii2/web/Response.php:366
Stack trace:
#0 /var/www/ru.site/vendor/yiisoft/yii2/web/Response.php(339): yii\web\Response->sendHeaders()
#1 /var/www/ru.site/vendor/yiisoft/yii2/base/Application.php(392): yii\web\Response->send()
#2 /var/www/ru.site/web/index.php(14): yii\base\Application->run()
#3 {main}


40 строка файла second2.php

<p><?= $arResult["BLOCK_ORDER"]["TOUR_NAME"] ?></p>


Мне совершенно не понятно, какие заголовки могут там отправляться?!
Все файлы в кодировке UTF-8
  • Вопрос задан
  • 587 просмотров
Пригласить эксперта
Ответы на вопрос 3
@morricone85
include_once('pdf_generator/index2.php');
include_once('pdf_generator/second2.php');


почему вы так подключаете файлы? что, содержат файлы index2.php и second2.php; в контроллерах, в общем то, include не используют
Ответ написан
Комментировать
@sorokinfil
Есть вероятность, что дело в так называемом BOM-маркере, который присутствует по умолчанию в UTF-8 кодировке. Сделайте бекап проблемного файла, который добавляется через include_once, и попробуйте пересохранить его код в UTF-8 без BOM. Такое можно сделать, например, в Notepad++.

Обновлено
Сейчас заметил, что в начале php-файла, который вы подключаете, html-код. Так делать нельзя. Вот пример функции, которую использую я, чтобы получать содержимое из файлов с html-кодом в переменную и не отправлять никаких заголовков.
function Get_HTML ($file)
{
	if (!file_exists ($file))
		return false;
	ob_start ();
	extract ($GLOBALS, EXTR_OVERWRITE);
	include ($file);
	$content = ob_get_contents ();
	ob_end_clean ();
	return $content;
}

Подключать вместо include таким образом
$content = Get_HTML ('path/to/your/include');
// ...
echo $content; // вывод на страницу не раньше, чем будут выполнены все php-скрипты
Ответ написан
@Arik
Может utf8 BOM? в редакторе ничего такого нет?
где-то умудрились отправить что-то. как вариант побегать с ob_start();, как ошибка пропала, то значит где-то выше
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы