PHP: 使用 inkscape 将 eps 转换为 svg
PHP: use inkscape to convert eps to svg
当我在终端中使用 inkscape
将 eps
转换为 svg
时,它工作正常。
但是当我使用 php 的 shell_exec
执行相同的命令时,它不起作用。 (我也尝试了 exec
和 system
但没有成功)
示例代码:
<?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 -> svg
和 pdf -> svg
下运行良好
我怀疑这是一个与 command works fine through terminal but not shell_exec php 类似的问题,但这种情况的解决方案是什么?
PS:我正在使用 this sample eps file 进行测试
编辑:
我将 2>&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 env 为空
(var_dump(shell_exec("printenv PATH"));
)
但是用于 eps
的 ghostscript
位于 /usr/bin/ghostscript
所以 PATH=/usr/bin
应该被添加到命令前面以使其正常工作
我猜权限。
PHP-shell 可能有效,因为它在您的本地用户下 运行ning。
检查您的网络服务器或 PHP-session 运行正在使用哪个用户并检查该用户是否可以访问 运行 inkscape。如果没有,请添加必要的权限。
当您在终端中 运行 PHP 它 运行 在打开终端的任何用户下,但是当您在网络服务器中 运行 它通常 运行s 在启动网络服务器的用户下(不过也有例外)。
您可以尝试在您的网络服务器中找到哪个用户 php 正在 运行ning 下的解决方案:
How to check what user php is running as?
授予该用户对您的 inkscape 文件夹的执行权限,它应该可以工作。
Inkscape 使用 ghostscript
进行 .eps
转换,在您的案例中抛出的错误并不提示它,但如果 inkscape 找不到 ghostscript 确实会引发 - 因此我建议您检查修改后的哪一部分 PATH
确实解决了问题。
您发现命令前面的最小 PATH=/usr/bin
足以解决您的问题,在我看来,这确实是更可取的解决方案。
当我在终端中使用 inkscape
将 eps
转换为 svg
时,它工作正常。
但是当我使用 php 的 shell_exec
执行相同的命令时,它不起作用。 (我也尝试了 exec
和 system
但没有成功)
示例代码:
<?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 -> svg
和 pdf -> svg
我怀疑这是一个与 command works fine through terminal but not shell_exec php 类似的问题,但这种情况的解决方案是什么?
PS:我正在使用 this sample eps file 进行测试
编辑:
我将 2>&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 env 为空
(var_dump(shell_exec("printenv PATH"));
)
但是用于 eps
的 ghostscript
位于 /usr/bin/ghostscript
所以 PATH=/usr/bin
应该被添加到命令前面以使其正常工作
我猜权限。
PHP-shell 可能有效,因为它在您的本地用户下 运行ning。
检查您的网络服务器或 PHP-session 运行正在使用哪个用户并检查该用户是否可以访问 运行 inkscape。如果没有,请添加必要的权限。
当您在终端中 运行 PHP 它 运行 在打开终端的任何用户下,但是当您在网络服务器中 运行 它通常 运行s 在启动网络服务器的用户下(不过也有例外)。
您可以尝试在您的网络服务器中找到哪个用户 php 正在 运行ning 下的解决方案: How to check what user php is running as?
授予该用户对您的 inkscape 文件夹的执行权限,它应该可以工作。
Inkscape 使用 ghostscript
进行 .eps
转换,在您的案例中抛出的错误并不提示它,但如果 inkscape 找不到 ghostscript 确实会引发 - 因此我建议您检查修改后的哪一部分 PATH
确实解决了问题。
您发现命令前面的最小 PATH=/usr/bin
足以解决您的问题,在我看来,这确实是更可取的解决方案。