【问题标题】:PHP: use inkscape to convert eps to svgPHP:使用inkscape将eps转换为svg
【发布时间】:2019-10-05 19:02:51
【问题描述】:

当我在终端中使用inkscapeeps 转换为svg 时,它工作正常。
但是当我使用 php 的shell_exec 执行相同的命令时,它不起作用。 (我也试过execsystem 没有运气)

示例代码:

<?php

unlink('./sample.svg');
$file_path = realpath('./sample.eps');
$dest_path = getcwd() . '/sample.svg';

//# inkscape --file=sample.eps --export-plain-svg=sample.svg
// command works fine in terminal but not in php

$command = "inkscape --file=$file_path --export-plain-svg=$dest_path";
// command fails with no output (null)
$output = shell_exec($command);
var_dump($output);
var_dump(is_file('./sample.svg'));

同样的命令在 php shell 中也能正常工作!
我无法确定原因,因为我无法检查输出(它始终为空)

ai -&gt; svgpdf -&gt; svg 的转换效果很好

我怀疑这是与command works fine through terminal but not shell_exec php 类似的问题,但这种情况的解决方案是什么?

PS:我正在使用this sample eps file 进行测试

编辑: 我将2&gt;&amp;1 添加到shell_exec 命令并得到了这个输出

/srv/www/git/presta17_designer/eps/sample.eps:1: parser error : Start tag expected, '<' not found
%!PS-Adobe-3.0 EPSF-3.0
^
/srv/www/git/presta17_designer/eps/sample.eps:1: parser error : Start tag expected, '<' not found
%!PS-Adobe-3.0 EPSF-3.0
^

** (inkscape:717): WARNING **: 14:16:21.492: Specified document /srv/www/git/presta17_designer/eps/sample.eps cannot be opened (does not exist or not a valid SVG file)

更多信息:
我在评论者的帮助下找到了问题的原因
shell_exec 中,PATH 环境为空
(var_dump(shell_exec("printenv PATH"));)
但是用于epsghostscript 位于/usr/bin/ghostscript
所以PATH=/usr/bin 应该被添加到命令之前,它才能正常工作

【问题讨论】:

  • 我不确定,但这可能是这种情况,当从终端运行时,您正在以系统用户身份访问inkscape,但是当从 php 运行命令时,php 可能没有调用应用程序的权限, 所以你也可以尝试以管理员身份运行它,你可以通过以下 runas /user:Administrator "cmdName parameters" 以管理员身份从 php 调用它
  • 从 pdf 转换为 svg 工作正常,这就是为什么我不怀疑这是权限问题
  • 一个常见的问题是环境变量。确保您的脚本的 PATH 没有以某种方式受到限制,以便它可以找到命令 inkscape 及其依赖项。如果您在 Windows 上,您可能需要在全局 PATH 而不是您用户的 PATH 中设置 Inkscape 路径,然后重新启动 Web 服务器以使其工作。
  • 是的,我不知道,它可能是任何东西,当它在 PHP 环境中运行时,您必须调试该命令以弄清楚发生了什么。在命令行中添加一个2&gt;&amp;1,这样你就可以看到它输出的错误,这可能会给你一个线索。
  • 所以你修改了'PATH'环境变量?您是否添加了 '/usr/local/bin' 部分?这表明 ghostscript 安装在“/usr/local”下,而不是像预期的那样,如果通过分发包安装,则安装在“/usr”下。很高兴知道解决方案的“原因”。

标签: php inkscape


【解决方案1】:

Inkscape 使用ghostscript 进行.eps 转换,在你的情况下抛出的错误并不暗示它,但如果inkscape 找不到ghostscript 确实会引发 - 因此我建议你检查修改的@ 的哪一部分987654323@ 确实解决了这个问题。

您发现命令前面的最小 PATH=/usr/bin 足以解决您的问题,在我看来,这确实是更可取的解决方案。

【讨论】:

    【解决方案2】:

    我猜是权限。

    PHP-shell 可能工作正常,因为它在您的本地用户下运行。

    检查您的网络服务器或 PHP 会话在哪个用户下运行,并检查该用户是否可以访问和运行 inkscape。如果没有,请添加必要的权限。

    当您在终端中运行 PHP 时,它会在打开终端的任何用户下运行,但是当您在网络服务器中运行它时,它通常会在启动网络服务器的用户下运行(但也有例外)。

    您可以尝试以下解决方案来查找在您的网络服务器中运行 php 的用户: How to check what user php is running as?

    授予该用户对您的 inkscape 文件夹的执行权限,它应该可以工作。

    【讨论】:

    • 我试过了,它在终端和 php shell 中都能正常工作,但在脚本中却没有
    猜你喜欢
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    相关资源
    最近更新 更多