Laravel导出listings表单行数据为PDF时报60秒执行超时如何解决?
错误原因
- 核心原因是你使用PHP内置的单线程开发服务器(也就是
php artisan serve启动的服务)导致的阻塞:你触发PDF生成请求时,Laravel常用的PDF扩展(比如dompdf)如果需要加载视图引用的CSS、图片等静态资源,会发起新的HTTP请求到本地127.0.0.1:8000端口,但是单线程服务器同一时间只能处理一个请求,当前PDF请求还没处理完,没法响应资源加载请求,就会一直等待直到超过PHP最大执行时间阈值。 - 次要可能原因:你的pdf_download视图代码存在未闭合的HTML标签(你提供的代码中table、tr等标签都没有完整闭合),dompdf解析不规范HTML时可能陷入死循环导致超时。
解决方法
- 方案1(优先推荐):放弃使用PHP内置单线程开发服务器,改用多进程的服务环境,比如XAMPP、WAMP、Nginx+PHP-FPM等,从根本上解决单请求阻塞问题。
- 方案2:修改PDF模板的资源加载方式,所有静态资源不要用
asset()生成HTTP网络地址,改用本地绝对路径:
比如加载图片用public_path('/assets/images/listings/'.$listing->listing_Fimage),CSS样式直接写在PDF模板的<style>标签内,不要外部引入HTTP地址的CSS文件,避免dompdf发起额外HTTP请求。 - 方案3(临时应急):在控制器生成PDF的代码前临时调高最大执行时间阈值,注意这只是治标方案,没有解决根本阻塞问题:
if($request->has('download')){ ini_set('max_execution_time', 120); // 可根据需要调整时长 $pdf = PDF::loadView('pdf_download'); return $pdf->download('pdf_download.pdf'); } - 方案4:补全pdf_download视图所有未闭合的HTML标签,保证HTML语法规范,避免dompdf解析异常。
内容的提问来源于stack exchange,提问作者imane
相关产品推荐
相关产品推荐

