ImageMagick занимает много времени для преобразования SVG с текстом в JPEG
Мы используем ImageMagick (версия: ImageMagick 6.9.1-7 Q16 x86_64) и его расширение PHP Imagick в нашем стеке LAMP для преобразования SVG в JPEG, и это занимает ненормально много времени, когда SVG содержит какой-либо текст (12-13 секунд / файл).
Когда та же самая вещь запускается как отдельный PHP-скрипт из командной строки (или напрямую с помощью IM-конвертации), она быстро конвертируется менее чем за 1 секунду, независимо от того, есть ли у нее текст или нет.
Стоит также упомянуть, что у нас нет этой проблемы с GraphicsMagick. (Но у него есть некоторые ошибки SVG, которые не устранены и мешают нам его использовать.)
У кого-нибудь есть идея, почему шрифты обрабатываются в стеке LAMP так долго, или как определить основную причину замедления?
Образец SVG:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="344" height="243" viewBox="0 0 737 521">
<g class="main">
<title>Main</title>
<image xmlns:xlink="http://www.w3.org/1999/xlink" id="svg_12" height="218.4417" width="291.2556" y="32.2537" x="-10.893" xlink:href="/tmp/767756670842438737_7032fbfb3c364e6da226254687eb1edb.jpg" style="pointer-events:inherit">29.75235 32.253654 209.964875 218.441697</image>
<g font-size="normal" font-family="Allerta" class="textarea" id="svg_13" style="pointer-events:inherit">
<rect opacity="0" fill-opacity="0" stroke-opacity="0" stroke-width="2" fill="#000" id="svg_10" height="32" width="150.4384" y="293.06824" x="550.14683" style="pointer-events:inherit"/>
<text text-anchor="start" xml:space="preserve" fill="#000" font-size="21" y="293" x="550" id="svg_68" style="pointer-events:inherit">
<tspan dy="14" x="550" xml:space="preserve" id="svg_69" style="pointer-events:inherit">
hello </tspan>
<tspan dy="21" x="550" xml:space="preserve" id="svg_70" style="pointer-events:inherit">gc </tspan>
</text>
</g>
</g>
</svg>
и код для преобразования:
$im = new Imagick();
$svg = file_get_contents($svgFile);
$svg = str_replace(array("\n", "\r", "\t"), '', $svg);
$im->readImageBlob($svg);
$im->setImageFormat("jpeg");
$im->writeImage($jpgFile);
$im->clear();
1 ответ
Что SVG конвертирует просто отлично для меня.
Чтобы выяснить это, нужно запустить PHP-скрипт через strace с помощью такой команды:
strace -f -F /usr/local/bin/php testScript.php
Но с соответствующим путем для PHP в вашей системе.
Существует большая вероятность того, что возникнет какая-то ошибка, из-за которой "что-то" займет гораздо больше времени, чем должно. Приведенная выше команда strace позволит вам увидеть все выполняемые системные вызовы и продолжительность каждого из них.
Я подозреваю, что какой-то системный вызов займет почти все общее время обработки перед возвратом кода ошибки. Если вы не можете понять, что означает вывод, пожалуйста, прикрепите вывод к вашему вопросу или вставьте, и я попытаюсь интерпретировать руны.
Предупреждение - strace способен собирать информацию, которую вы, возможно, не хотите раскрывать (например, секретные ключи), поэтому следует соблюдать осторожность, прежде чем публиковать свои выходные данные.