Heroku - wkhtmltopdf - laravel-snappy:生产服务器上的路径错误

Heroku - wkhtmltopdf - laravel-snappy : wrong path on production server

这是我的情况,我在我的 Ubuntu 上安装了 laravel-snappy,它是 wkhtmltopdf 的包装器,用于基于 [=] 的 php 项目57=] 框架。 我需要将 html 转换为 pdf 并通过电子邮件发送它们,所以我实际上使用了一个名为 laravel-snappy 的 wkhtmltopdf 包装器。

但我必须解决的第一个问题是 snappy 在我的 ubuntu 系统上查找了错误的目录,所以我通过在它查找的位置创建一个 symlink 使其工作为了: sudo ln -s /usr/bin/wkhtmltopdf /usr/local/bin/wkhtmltodpf 现在它在我的本地服务器上运行良好。

但是当我在 heroku(cedar-14 堆栈)上部署我的应用程序时,它不起作用,这是我收到的错误消息(实际上我的笔记本电脑上也有):

Apr 13 18:24:37 luckey app/web.1: stderr: "sh: 1: **/usr/local/bin/wkhtmltopdf: not found**

然后我天真地尝试做: heroku 运行 "sudo ln -s /usr/bin/wkhtmltopdf /usr/local/bin/wkhtmltopdf" --app luckey-dev<br> 运行 sudo ln -s /usr/bin/wkhtmltopdf /usr/local/bin/wkhtmltopdf 在 luckey-dev 上...开始,运行.4999 运行 sudo ln -s /usr/bin/wkhtmltopdf /usr/local/bin/wkhtmltopdf 在 luckey-dev 上...正在连接,运行.499 运行 sudo ln -s /usr/bin/wkhtmltopdf /usr/local/bin/wkhtmltopdf on luckey-dev...up, 运行.4999 bash: **sudo: 找不到命令**

然后: heroku 运行 "ln -s /usr/bin/wkhtmltopdf /usr/local/bin/wkhtmltopdf" --app luckey-dev<br> 运行 ln -s /usr/bin/wkhtmltopdf /usr/local/bin/wkhtmltopdf on luckey-dev...up, 运行.5658 ln: 未能创建符号 link '/usr/local/bin/wkhtmltopdf': **只读文件系统**

我想知道在 Procfile 中添加这个是否可行: system: sudo ln -s /usr/bin/wkhtmltopdf /usr/local/bin/wkhtmltopdf 当您输入自己的名字时,它似乎将作为工作进程类型启动。

我知道它是通过多 buildpack 配置正确安装的,因为我可以在服务器上看到版本:

heroku run "wkhtmltopdf -V" --app luckey-dev Running wkhtmltopdf -V on luckey-dev... up, run.3446 wkhtmltopdf 0.12.2.1 (with patched qt)

所以知道如何让 heroku 使用正确的二进制文件位置,或者告诉 Snappy 在不查找二进制文件路径的情况下执行 wkhtmltopdf 因为别名 wkhtmltopdf 似乎如果我可以通过键入执行 wkhtmltopdf -V.

获得它的版本,则正确创建

任何建议/想法将不胜感激:)

最后我找到了解决这个问题的办法:

首先,我们必须 fork barryvdh 包装器的 laravel-snappy,以便编辑 snappy.php 文件供我们自己使用: <?php return array( 'pdf' => array( 'enabled' => true, 'binary' => '/usr/local/bin/wkhtmltopdf', 'timeout' => false, 'options' => array(), 'env' => array(), ), 'image' => array( 'enabled' => true, 'binary' => '/usr/local/bin/wkhtmltopdf', 'timeout' => false, 'options' => array(), 'env' => array(), ), );

使用 heroku 我无法创建符号链接,所以我不再寻找一种方法。

方案一:'Meh' 然后我尝试使 pdf 对象的二进制值与 heroku 上 wkhtmltopdf 的二进制位置相匹配。我可以用这个命令来做到这一点: heroku run "type -a wkhtmltopdf " --app luckey-dev Running type -a wkhtmltopdf on luckey-dev... up, run.5547 wkhtmltopdf is /app/bin/wkhtmltopdf

然后编辑 snappy.php 文件上的二进制值: 'binary' => '/app/bin/wkhtmltopdf'

解决方案 2:'way better':解决方案 1 可能是解决方案(并且有效),为该位置提供二进制值。但还有更好的解决方案: 'binary' => 'wkhtmltopdf' 是的,直截了当,只需提供别名...Heroku 将知道从哪里获得它...只需确保您的 wkhtmltopdf buildpacks 在 Heroku 中安装良好,感谢此命令: heroku run "wkhtmltopdf -V" --app appName

然后为了记录我有其他问题,因为我试图转换为 pdf 的 html 文件有一些来自另一个域的 css 文件。然后您会收到此错误 Exit with code 1 due to network error: ContentNotFoundError。 要解决此问题,您需要在 html 文件上添加一个基本标签,然后您所有相对于资产的 url 都将基于此基本标签 href: <base href="https://yourProductionDomain/">

很高兴我能完成这项工作。 希望这对其他人也有帮助。

Metux.