2015-07-17 4 views
1

Мы используем ImageMagick (версия: ImageMagick 6.9.1-7 Q16 x86_64) и его расширение PHP Imagick в нашем стеке LAMP для преобразования SVG в JPEG, и он принимает ненормально длительное время, когда SVG содержит любой текст (12-13 секунд/файл).ImageMagick занимает много времени, чтобы преобразовать SVG с текстом в JPEG

Когда одно и то же выполняется как автономный 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(); 
+0

Какова ваша операционная система, и знаете ли вы, что IM использует собственный svg-ридер или используется rsvg? – dlemstra

+0

Привет. Мы используем Ubuntu (12), и он использует делегата RSVG. –

+0

Мое предположение заключается в том, что PHP накладывает ограничение на лимит памяти, отсутствующее в командной строке, - попробуйте запустить 'ident-list resource' как в командной строке, так и внутри PHP, используя' system() 'или somesuch. –

ответ

0

Это SVG преобразующий очень хорошо для меня.

Путь исследовать это запустить скрипт через Трассирование с помощью следующей команды:

strace -f -F /usr/local/bin/php testScript.php 

Но соответствующий путь для PHP на вашей системе.

Существует высокая вероятность того, что есть какое-то условие ошибки, которое делает «что-то» гораздо длиннее, чем нужно. Команда strace, приведенная выше, позволит вам увидеть все системные вызовы, которые выполняются, и как долго каждый из них принимает.

Я подозреваю, что вы увидите, что какой-то системный вызов занимает почти все общее время обработки, прежде чем возвращать код ошибки. Если вы не можете понять, что означает его выход, приложите результат к вашему вопросу или пастебину, и я попытаюсь интерпретировать руны.

Предупреждение - strace способен захватывать информацию, которую вы, возможно, не хотите выявлять (например, секретные ключи), поэтому следует заботиться, прежде чем публиковать ее выход в любом месте.