You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_value[memory_limit] = 2G
    rlimit_memlock = unlimited
    
    修改后重启php-fpm:systemctl 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 17:54:50