Моя проблема
Я использую cairosvg на Linux Ubuntu 14.04 LTS с PHP и Apache. Я запускаю его с функцией PHP system()
, Это команда, которую я выполняю.
cairosvg -f pdf -o /var/www/dev/output.pdf /var/www/dev/input.svg
Когда я запускаю это в терминале, я получаю ожидаемые результаты, он генерирует PDF-файл, как и ожидалось. Однако, когда я запускаю это в PHP с помощью system()
, он все еще генерирует файл PDF, но не использует правильные шрифты.
Что я пробовал
Шрифты установлены. Права доступа к файлу как для папки, так и для шрифтов были установлены на 777. Apache был установлен как совладелец для папки шрифтов и шрифта. Пути к файлам являются абсолютными. echo
на system()
не дает ошибок. Я пытался использовать эквивалентные альтернативы system()
также.
1-е основное обновление: Я попытался запустить эту команду ImageMagick, чтобы проверить разницу в доступных шрифтах. convert -list font
На терминале я вижу свои установленные шрифты, но не на system()
вызов.
2-е ОБНОВЛЕНИЕ Я побежал printenv
команда в терминале и system()
и увидел, что у них были разные ценности. Я устанавливаю переменные среды HOME и USER, используя proc_open()
, но я получаю те же результаты. Код выглядит следующим образом.
$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 и / или пользователь apache www-data
могли получить доступ только к шрифтам, если /usr/share/fonts
папка, независимо от файла или разрешения пользователя.