Laravel从存储加载动态图片生成PDF时程序停滞问题
我之前也碰到过类似的mPDF加载动态图片卡死的情况,结合你的代码细节来看,大概率是这几个原因,对应的解决办法可以试试:
1. mPDF无法解析Storage生成的Web URL
Storage::url()生成的是需要通过HTTP访问的相对/绝对URL,但mPDF在服务器端渲染时,可能没办法正常通过HTTP请求获取本地存储的图片(比如本地环境没有配置正确的域名,或者权限限制导致请求阻塞),进而导致进程一直等待响应最终挂起。
解决办法:使用本地文件绝对路径替代Web URL
直接用Storage::path()获取图片在服务器上的物理路径,mPDF可以直接读取本地文件:
@foreach($employeeMedCert as $med) <img src="{{ Storage::path($med->attachment) }}"> @endforeach
如果路径识别有问题,也可以给路径加上file://前缀(部分环境需要):
<img src="file://{{ Storage::path($med->attachment) }}">
2. 图片格式/编码异常导致mPDF处理阻塞
虽然图片体积不大,但带特殊EXIF信息、非标准编码的图片,可能会让mPDF的图片解析逻辑出现异常,进而卡住进程。
解决办法1:上传时预处理图片
用Intervention Image库对上传的图片重新编码,转换成标准的JPG/PNG格式:
// 上传控制器中修改 use Intervention\Image\Facades\Image; $file = request('file'); // 重新编码为标准JPG,保留90%质量 $processedImage = Image::make($file)->encode('jpg', 90); // 保存到存储 $path = Storage::putFile('public/employees', $processedImage, 'public'); // 后续创建记录的代码不变 employeeAttachment::create([ 'attachment' => $path, 'attachmentType' => Storage::mimeType($path), 'category' => $request->type, 'endDate' => $request->dueDate, 'date' => $request->date, 'employeeID' => $employee, 'createdBy' => Auth::id() ]);
解决办法2:将图片转为Base64嵌入HTML
把图片内容编码成Base64直接写在img标签里,避免mPDF去外部读取文件:
@foreach($employeeMedCert as $med) @php // 获取图片内容并编码 $imageBase64 = base64_encode(Storage::get($med->attachment)); $mime = Storage::mimeType($med->attachment); @endphp <img src="data:{{ $mime }};base64,{{ $imageBase64 }}" alt="员工照片"> @endforeach
这种方式虽然会让HTML体积变大,但稳定性很高,完全避免了外部文件读取的问题。
3. mPDF配置或PHP内存限制不足
mPDF处理图片需要一定的内存,默认配置的内存限制或超时时间不足,也可能导致进程崩溃挂起。
解决办法:调整内存和超时配置
- 如果发布了mPDF的配置文件(
config/pdf.php),可以修改参数:
return [ 'mPDF' => [ 'memory_limit' => '256M', // 提升内存限制 'curl_timeout' => 10, // 设置请求超时时间 // 其他配置... ] ];
- 也可以在生成PDF的控制器代码中临时调整PHP内存:
// 临时提升内存限制 ini_set('memory_limit', '256M'); $pdf = PDF::loadView('你的视图名称', $data);
额外注意:修正Blade语法错误
你提供的Blade代码里多了多余的大括号{,虽然可能不影响输出,但可能导致HTML解析异常,建议修正:
// 错误写法 @foreach($employeeMedCert as $med){ <img...> @endforeach // 正确写法 @foreach($employeeMedCert as $med) <img src="{{...}}"> @endforeach
可以先测试用本地静态图片的绝对路径替换动态路径,确认PDF能正常生成后,再针对性解决动态图片的问题。
内容的提问来源于stack exchange,提问作者Matthew

