Laravel 7 PDF功能本地正常公网服务器报HTTP ERROR 500问题求解
排查解决步骤
第一步:先获取具体错误信息
500错误属于服务端通用报错,必须拿到具体异常才能精准定位:
- 临时将线上项目
.env文件中的APP_DEBUG参数改为true,触发一次PDF生成操作即可看到具体报错,排查完成后立刻改回false避免泄露服务端信息 - 也可以直接查看项目
storage/logs目录下的最新日志文件,找到对应时间点的错误记录
第二步:排查高频触发原因
目录权限问题
你代码中print逻辑需要将生成的PDF写入pdf/reports/stock/目录,首先确认线上环境该目录是否存在,其次要给该目录、Laravel默认的storage、bootstrap/cache目录开放web服务器运行用户(如www-data、nginx)的读写权限。本地环境通常权限限制宽松,所以不会触发该类错误。依赖与扩展缺失
检查线上是否安装了DomPDF需要的PHP扩展:mbstring、gd、dom、xml,很多服务器精简镜像默认不会安装全部扩展,而本地集成环境(如XAMPP、PHPStudy)默认会装全所有常用扩展。同时执行composer install确认线上vendor目录下的依赖包和本地版本完全一致。路径解析错误
你代码中读写文件用的是相对路径pdf/reports/stock/,线上环境的运行工作目录和本地不同的话,相对路径会定位失败。建议改用Laravel提供的绝对路径辅助函数拼接路径,修改对应代码:
// 原来的相对路径写法替换为 $pdfPath = public_path('pdf/reports/stock/stock-report.pdf'); if(file_exists($pdfPath)){ unlink($pdfPath); } $pdf->save($pdfPath); return redirect(url('pdf/reports/stock/stock-report.pdf'));
PHP版本不兼容
Laravel 7仅支持PHP 7.2.5 ~ 7.4版本,如果线上PHP版本为8.0+,会出现兼容报错,需确认线上PHP版本和本地一致。内存/执行超时
如果产品数据量较大,生成PDF需要消耗更多内存和执行时间,线上php.ini配置的memory_limit、max_execution_time参数值过低也会触发500错误,可临时在控制器方法开头加下面两行代码验证:
ini_set('memory_limit', '256M'); ini_set('max_execution_time', 120);
静态资源加载失败
检查.env文件中APP_URL参数是否和线上实际访问域名一致,DomPDF渲染Blade视图时会加载对应的CSS、图片等静态资源,APP_URL配置错误会导致资源加载失败,触发渲染异常。中文字体缺失
如果生成的PDF包含中文内容,线上DomPDF没有安装对应中文字体的话,渲染时也会抛出异常,需要给线上DomPDF配置中文字体支持。
内容的提问来源于stack exchange,提问作者Olu-Stephen

