我正在使用 FPDF/TCPDF 和 Yii2。这两个库(以及其他库)都可以直接将数据发送到客户端。所以 Yii2 响应是没有必要的。它甚至必须被关闭。我怎样才能做到这一点?
目前,我收到以下错误,该错误可以在创建的 PDF 文件的末尾找到(使用文本编辑器):
yii\web\HeadersAlreadySentException: Headers already sent in /var/www/html/production-service/vendor/setasign/fpdf/fpdf.php on line 1017. in /var/www/html/my-app/vendor/yiisoft/yii2/web/Response.php:378
使用以下代码:
class MyController extends yii\web\Controller {
public function actionCreatePdf() {
$pdf = new FPDF();
...
$pdf->Output('D', 'my.pdf');
}
}
最佳答案
使用Response::$isSent
属性(property)不可靠。只要一切正常,它就可以工作。但是,如果您在响应生成过程中遇到异常(例如FPDF
可能抛出异常),您将再次获得HeadersAlreadySentException
,因为错误处理程序会重置响应对象并再次发送它。据我所知,唯一的解决方案是创建不发送任何内容的转储响应对象,并将其设置为响应组件:
class DumbResponse extends \yii\web\Response {
public function send() {
}
}
在 Controller 操作中:
public function actionCreatePdf() {
Yii::$app->setComponents([
'response' => DumbResponse::class
]);
$pdf = new FPDF();
// ...
$pdf->Output('D', 'my.pdf');
}
关于yii2 - 如何让 Yii2 响应不同的 HTTP 响应?将在库中创建。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50023586/