PHP system() 给出的结果与终端不同,缺少字体


PHP system() gives different results than terminal, missing fonts

我的问题

我在 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()通话中看不到。

第二次更新 我在终端和system()中都运行了printenv命令,并看到它们具有不同的值。我使用 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()中运行时才会通过

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

我能想到:

$ xset fb rehash

从手册页:

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

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

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

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