【问题标题】:PHP system() gives different results than terminal, missing fontsPHP system() 给出的结果与终端不同,缺少字体
【发布时间】:2016-03-10 15:52:06
【问题描述】:

我的问题

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

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

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

我的尝试

字体已安装。文件夹和字体的文件权限已设置为 777。Apache 已设置为字体文件夹和字体的共同所有者。文件路径是绝对的。 echo on 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()system()

【问题讨论】:

  • 您可以检查几件事:1) apache 或使用system() 时使用的任何终端用户是否可以访问字体文件夹? 2) 通过 PHP 运行时路径可能不同,因此无法找到正确的字体文件并将其替换为默认字体文件。 3)如果你echosystem()命令像任何错误一样有任何输出吗?
  • @JamieBicknell 试过这些,没有运气,更新了问题。
  • 不确定我是否理解您的问题。您是否在问为什么 cairosvg 在 Apache 下的 PHP 中通过 system() 运行时看不到您的字体,而 ImageMagick(既不是 cairosvg,也不是 PHP,也不是 Apache)可以看到您的字体?为什么你认为这两件事是相关的?
  • @MarkSetchell 否。在终端和system() 中运行完全相同的命令,第一个命令cairosvg -f pdf -o /var/www/dev/output.pdf /var/www/dev/input.svg。第二个命令convert -list font 仅用于检查终端和system() 之间可用字体的差异。我将更新问题以澄清。
  • 今天感觉有点昏暗,还是没明白!你是说cairosvgImageMagick 在终端上都可以正常工作,但是在 PHP+Apache 下运行时都看不到你的字体文件?

标签: php linux terminal ubuntu-14.04 cairo


【解决方案1】:

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

我能想到:

$ xset fb rehash

来自手册页:

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

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

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

【讨论】:

  • 它们在终端中工作,但在 system() 中似乎失败了。这些命令的含义和作用是什么?
  • 你试过<?php system("xset +fp /usr/share/fonts/misc && xset fb rehash && cairosvg -f pdf -o /var/www/dev/output.pdf /var/www/dev/input.svg"); ?>吗?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2020-09-13
    • 2021-03-05
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    相关资源
    最近更新 更多