CentOS下用Snappy Laravel生成大PDF报signal 11错误求助
解决CentOS下Snappy生成超3000页PDF时的Signal 11错误
问题背景
Windows环境下使用Snappy生成PDF一切正常,但在CentOS 7服务器上生成超过3000页的大PDF时,抛出Symfony\Component\Process\Exception\ProcessSignaledException错误,提示进程收到signal 11(段错误)。800页以内的PDF生成无异常,已尝试更换wkhtmltopdf CentOS版本、使用vendor二进制文件、优化数据库查询等方案,均未解决问题。
可行解决方法
1. 调整系统与PHP的资源限制
Signal 11通常与内存溢出或进程资源不足有关,先放开系统和PHP的资源限制:
- 临时调整系统内存限制:执行命令(重启后失效)
ulimit -v unlimited - 永久调整系统限制:编辑
/etc/security/limits.conf,添加以下内容,然后重启系统或重新登录* soft memlock unlimited * hard memlock unlimited * soft stack 65536 * hard stack 65536 - 调整PHP内存限制:在
php.ini中修改(或代码中临时设置)ini_set('memory_limit', '2G'); // 根据实际情况调整,比如4G - 调整PHP-FPM资源限制:编辑
/etc/php-fpm.d/www.conf,添加或修改
修改后重启php-fpm:php_value[memory_limit] = 2G rlimit_memlock = unlimitedsystemctl restart php-fpm
2. 分段生成PDF后合并
大文件一次性生成容易触发内存瓶颈,可将数据拆分多个批次生成小PDF,再用Ghostscript合并:
// 1. 拆分数据(按每页对应的数据量计算chunk大小,示例按800页对应一个chunk) $chunkSize = 800; $chunks = array_chunk($fdatas, $chunkSize); $tempPdfPaths = []; // 2. 循环生成小PDF foreach ($chunks as $index => $chunkData) { $body = view('ENG.Reports.Bomrep.BomRepdtlallpdfBody', [ 'fdatas' => $chunkData, 'unit_detail' => $unit_detail, 'unit_code' => $unit_code, 'unitname' => $unitname, 'pcode' => $pcode, 'userData' => $userData ])->render(); $snappy = app('snappypdf'); $header = view('ENG.Reports.Header')->render(); $pdf = $snappy->loadHTML($body, [], [ 'enable-local-file-access' => true, 'orientation' => 'portrait', 'encoding' => 'UTF-8', 'dpi' => 72, 'no-stop-slow-scripts' => true, 'disable-javascript' => true // 不需要JS时开启,减少内存占用 ]); $pdf->setTimeout(100000000); $pdf->setOption('margin-top', 12); $pdf->setOption('header-html', $header); $pdf->setOption('header-spacing', 2); // 保存临时PDF $tempPath = storage_path("temp_bom_{$index}.pdf"); $pdf->save($tempPath); $tempPdfPaths[] = $tempPath; } // 3. 用Ghostscript合并PDF $finalPdfPath = storage_path('BOMdetail.pdf'); // 拼接合并命令,注意路径转义 $command = sprintf( "gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/default -sOutputFile=%s %s", escapeshellarg($finalPdfPath), implode(' ', array_map('escapeshellarg', $tempPdfPaths)) ); exec($command, $output, $returnVar); // 4. 清理临时文件 foreach ($tempPdfPaths as $path) { if (file_exists($path)) { unlink($path); } } // 5. 返回下载响应 return response()->download($finalPdfPath)->deleteFileAfterSend(true);
注意:需先安装Ghostscript:
yum install -y ghostscript
3. 优化wkhtmltopdf参数
禁用不必要的特性,减少内存消耗:
$pdf->setOption('disable-javascript', true); // 无JS需求时开启 $pdf->setOption('disable-images', true); // 无图片需求时开启 $pdf->setOption('lowquality', true); // 降低PDF质量,减少内存占用 $pdf->setOption('no-stop-slow-scripts', true); $pdf->setOption('disable-external-links', true); // 无外部链接需求时开启
4. 检查并补全系统依赖
wkhtmltopdf依赖部分图形库,CentOS上可能缺失导致不稳定:
yum install -y libXext libXrender fontconfig libfontconfig-devel xorg-x11-fonts-75dpi xorg-x11-fonts-Type1
内容的提问来源于stack exchange,提问作者Vaibhav31390
相关产品推荐
相关产品推荐

