Chernichko
@Chernichko
Учусь.

Почему выскакивает ошибка заголовков при формировании csv файла?

Формирую файл:

public function actionExport(){

        $list = Tours::find()->select('id,name,code')->all();

        foreach ($list as $value) {
                $s = $value->name . '|' . Url::base(true) . '/tours/' . $value->code . '/';
                $data[] = $s;
        }

        header("Content-type: text/csv");
        header("Content-Transfer-Encoding: UTF-8");
        header("Content-Disposition: attachment; filename=export-tours.csv");
        header("Pragma: no-cache");
        header("Expires: 0");

        $outputBuffer = fopen("php://output", 'w');

        fprintf($outputBuffer, chr(0xEF).chr(0xBB).chr(0xBF)); //1557 строка

        fputcsv($outputBuffer, ['name','url'], ';');

        foreach ((array)$data as $val) {
            fputcsv($outputBuffer, (array)explode('|', $val), ';');
        }

        fclose($outputBuffer);
    }


Файл скачивается, но в конце файла текст

<pre>An Error occurred while handling another error:	
yii\web\HeadersAlreadySentException: Headers already sent in /usr/share/nginx/html/project.eng/modules/admin/controllers/ToursController.php on line 1557. in /usr/share/nginx/html/project.eng/vendor/yiisoft/yii2/web/Response.php:366	
Stack trace:	
#0 /usr/share/nginx/html/project.eng/vendor/yiisoft/yii2/web/Response.php(339): yii\web\Response->sendHeaders()
#1 /usr/share/nginx/html/project.eng/vendor/yiisoft/yii2/web/ErrorHandler.php(135): yii\web\Response->send()
#2 /usr/share/nginx/html/project.eng/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/project.eng/modules/admin/controllers/ToursController.php on line 1557. in /usr/share/nginx/html/project.eng/vendor/yiisoft/yii2/web/Response.php:366	
Stack trace:	
#0 /usr/share/nginx/html/russiadiscovery.eng/vendor/yiisoft/yii2/web/Response.php(339): yii\web\Response->sendHeaders()
#1 /usr/share/nginx/html/russiadiscovery.eng/vendor/yiisoft/yii2/base/Application.php(392): yii\web\Response->send()
#2 /usr/share/nginx/html/russiadiscovery.eng/web/index.php(12): yii\base\Application->run()
#3 {main}</pre>
  • Вопрос задан
  • 174 просмотра
Пригласить эксперта
Ответы на вопрос 2
@Catrinblaidd
Он же Вам человечьим языком молвит,
Headers already sent in /usr/share/nginx/html/project.eng/modules/admin/controllers/ToursController.php on line 1557.

Т.е. заголовки уже отправлены, в файле таком-то строке такой-то.
Функцию header() можно вызывать только если клиенту еще не передавались данные. Т.е. где-то раньше был вывод через echo или html или функцию header(); Вот https://www.php.net/manual/ru/function.header.php
Ответ написан
Комментировать
Lobotomist
@Lobotomist
Software Developer
Приглядитесь к ошибке:
yii\web\HeadersAlreadySentException:
Headers already sent in /usr/share/nginx/html/project.eng/modules/admin/controllers/ToursController.php on line 1557.
in /usr/share/nginx/html/project.eng/vendor/yiisoft/yii2/web/Response.php:366


О чем она говорит? Вы уже отправили заголовки в своем скрипте (ToursController.php on line 1557). А потом в Response.php(339) yii2 пытается снова их отправить и возникает исключение, так как они уже были отправлены.

Наиболее адекватное решение проблемы - не формировать ответ пользователю руками, а использовать предназначенный для этого класс Response. Как это делать можно прочитать в гайде. Полагаю, вам наиболее уместно отправлять поток `php://output` с помощью sendStreamAsFile.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы