PHP系统()提供与终端不同的结果,缺少字体

时间:2016-03-10 15:52:06

标签: php linux terminal ubuntu-14.04 cairo

我的问题

我在Linux Ubuntu 14.04 LTS上使用cairosvg与PHP和apache。我正在使用php函数system()运行它。这是我正在运行的命令。

cairosvg -f pdf -o /var/www/dev/output.pdf /var/www/dev/input.svg

当我在终端中运行它时,我得到了预期的结果,它按预期生成了pdf文件。但是当我使用system()在php中运行它时,它仍会生成pdf文件,但不使用正确的字体。

我尝试了什么

已安装字体。文件夹和字体的文件权限已设置为777.Apache已设置为字体文件夹和字体的共同所有者。文件路径是绝对的。 echo上的system()没有错误。我也试过使用system()的等效替代品。

第一次重大更新:我已尝试运行此ImageMagick命令来检查可用字体的差异。 convert -list font在终端上,我看到了我安装的字体,但没有看到system()电话。

第二次更新我在终端和printenv中都运行了system()命令,看到它们有不同的值。我使用proc_open()设置HOME和USER环境变量,但得到相同的结果。代码如下。

$command = "cairosvg -f pdf -o /var/www/dev/output.pdf /var/www/dev/input.svg";
$descriptorspec = array();
$pipes = array();
$env = array(
    'HOME' => '/home/ntwdev',
    'USER' => 'ntwdev',
);
$resource = proc_open(
    $command,
    $descriptorspec,
    $pipes,
    $cwd = null,
    $env
);

当我在终端中运行命令而不是system()

时,为什么字体才会出现?

2 个答案:

答案 0 :(得分:0)

您可以尝试执行某些命令以在创建PDF命令之前重新构建字体缓存吗?

我能想到:

$ xset fb rehash

从手册页:

  

rehash参数将字体路径重置为其当前值,导致服务器重新读取   当前字体路径中的字体数据库。这通常仅在向a添加新字体时使用   字体目录(在运行mkfontdir以重新创建字体数据库之后)。

如果你在特殊目录中有字体,你可以:

$ xset +fp /usr/share/fonts/misc

答案 1 :(得分:0)

问题是cairosvg和/或www-data的apache用户只能访问/usr/share/fonts文件夹中的字体,无论文件或用户权限如何。