如何解决Laravel7升级后laravel/snappy错误代码127?
解决Laravel 7中laravel/snappy生成PDF时的exit status code 127错误
问题根源
从你给出的错误日志能一眼看出问题所在:
stderr: "sh: 1: /usr/local/bin/wkhtmltopdf: not found"
这说明系统找不到wkhtmltopdf这个核心依赖工具——laravel/snappy本身不负责PDF渲染,它只是调用wkhtmltopdf这个第三方工具来完成PDF生成,一旦这个工具没安装或者配置路径不对,就会抛出127错误(命令未找到)。
分步解决方案
1. 先确认wkhtmltopdf是否已安装
在终端执行以下命令,快速排查工具状态:
which wkhtmltopdf
- 如果没有任何输出,说明你还没安装wkhtmltopdf,直接看步骤2;
- 如果有输出(比如
/usr/bin/wkhtmltopdf),说明工具已安装,但配置里的路径写错了,直接跳步骤3。
2. 安装wkhtmltopdf
根据你的操作系统选择对应命令:
- Ubuntu/Debian 系统:
sudo apt-get update && sudo apt-get install wkhtmltopdf # 额外装依赖库,避免无头环境报错 sudo apt-get install libxrender1 libfontconfig1 libxext6 - CentOS/RHEL 系统:
sudo yum install epel-release sudo yum install wkhtmltopdf - MacOS 系统:
brew install wkhtmltopdf - Windows 系统:
去wkhtmltopdf官网下载对应版本安装包,安装后把它的bin目录(比如C:\Program Files\wkhtmltopdf\bin)添加到系统环境变量PATH里。
3. 修正laravel/snappy的配置路径
如果wkhtmltopdf的实际路径不是默认的/usr/local/bin/wkhtmltopdf,需要调整Laravel的配置:
- 先发布snappy的配置文件(没发布过的话):
php artisan vendor:publish --provider="Knp\Snappy\SnappyServiceProvider" - 打开项目根目录的
config/snappy.php,找到pdf配置块,把binary字段改成你的wkhtmltopdf实际路径:'pdf' => [ 'enabled' => true, 'binary' => '/usr/bin/wkhtmltopdf', // 替换成你实际查到的路径 'timeout' => false, 'options' => [], 'env' => [], ],
4. 无头服务器(无桌面环境的VPS)额外配置
如果你的项目部署在没有图形界面的服务器上,得装xvfb模拟显示环境:
sudo apt-get install xvfb
然后修改snappy配置里的binary字段,用xvfb-run包裹wkhtmltopdf命令:
'binary' => 'xvfb-run --server-args="-screen 0, 1024x768x24" /usr/bin/wkhtmltopdf',
验证修复
重新运行你的PDF生成代码:
$data['company'] = $this->user->company->toArray(); $data['departments'] = $this->user->company->departments->toArray(); $this->prepareText($data); /* @var $pdf PdfWrapper */ $pdf = App::make('snappy.pdf.wrapper'); $pdf->loadView('ticket.index', compact('data')) ->setOrientation('landscape') ->setOption('encoding', 'utf-8') ->setPaper('a4'); return $pdf->inline(sprintf('Employee-Report-(%s).pdf', Jalalian::forge('now')->format('Y-m-d')));
正常情况下,现在应该能顺利生成并下载PDF了。
内容的提问来源于stack exchange,提问作者Alireza Amrollahi
相关产品推荐
相关产品推荐

