Мне нужно конвертировать файлы ai и eps в svg для использования с инструментом настройки продукта.
Для этого я конвертирую из ai или eps в eps (чтобы удалить любые артборды или пробелы вокруг файла), а затем в svg.
Все это делается после загрузки оригинального файла с этим кодом PHP:
if(!empty($_FILES))
{
//$rustart = getrusage();
//var_dump($_FILES);
$tempFile = $_FILES['file']['tmp_name'];
$filePrefix = "file_" . time() . "_";
$targetName = $this->santitizeFilename($_FILES['file']['name']);
//var_dump($targetName);
$finalName = $filePrefix . $targetName;
$targetFile = $rootFolder . $ds . $finalName;
move_uploaded_file($tempFile, $targetFile);
$response['filepath'] = $relativeFolder . $ds . $this->getFilenameWithExtension($targetFile);
//$response['success'] = file_exists($targetFile);
$response['id_file'] = -1;
$ext = pathinfo($targetFile, PATHINFO_EXTENSION);
if($ext == 'svg')
{
$response['filepath'] = $relativeFolder . $ds . $this->replaceExtension($targetFile, 'svg');
}
if($ext == 'ai' || $ext == 'eps')
{
$epsPath = $rootFolder . $ds . $this->replaceExtension($targetFile, 'eps');
$epsCmd = "inkscape " . $targetFile . " -D -E " . $epsPath;
$startEps = microtime(true);
exec($epsCmd);
$endEps = microtime(true);
$svgPath = $rootFolder . $ds . $this->replaceExtension($targetFile, 'svg');
$svgCmd = "inkscape " . $epsPath . " --export-plain-svg=" . $svgPath;
$startSvg = microtime(true);
exec($svgCmd);
$endSvg = microtime(true);
$response['epsTime'] = $endEps - $startEps;
$response['svgTime'] = $endSvg - $startSvg;
$response['filepath'] = $relativeFolder . $ds . $this->replaceExtension($targetFile, 'svg');
$vectorFile = new MCVectorFile();
$vectorFile->url = $epsPath;
if($vectorFile->save()){
$response['id_file'] = $vectorFile->id;
}}
При регистрации времени $ epsTime и $ svgTime я получаю около 12 секунд каждый раз.
Это действительно долго, и я не вижу, чтобы он хорошо масштабировался для одновременной загрузки файлов несколькими пользователями на сайт …
Кроме того, выполнение только одной команды не улучшает время, оно по-прежнему занимает около 12 секунд на команду.
Есть ли способ, которым я могу ускорить это? Есть ли другой способ сделать это преобразование, кроме Inkscape?
РЕДАКТИРОВАТЬ: Таким образом, я попытался запустить сценарий оболочки вместо этого, и это занимает то же время, однако, если я запускаю сценарий непосредственно на сервере, это занимает гораздо меньше времени. Таким образом, кажется, что проблема в некотором ожидании из-за отсутствия разрешений, даже если файлы наконец созданы. Это вывод, который я получаю при запуске из php:
** (inkscape:31337): WARNING **: Unable to create profile directory (Permission denied) (13)
** Message: Cannot create profile directory /usr/share/httpd/.config/inkscape.
** Message: Inkscape will run with default settings, and new settings will not be saved.
** (inkscape:31337): WARNING **: Could not create extension error log file '/usr/share/httpd/.config/inkscape/extension-errors.log'
** (inkscape:31344): WARNING **: Unable to create profile directory (Permission denied) (13)
** Message: Cannot create profile directory /usr/share/httpd/.config/inkscape.
** Message: Inkscape will run with default settings, and new settings will not be saved.
** (inkscape:31344): WARNING **: Could not create extension error log file '/usr/share/httpd/.config/inkscape/extension-errors.log'
Я не уверен, что я должен дать разрешения на эти папки для Apache. Но, похоже, это те конфигурации inkscape, которые мне, вероятно, не нужны для того, что я делаю. Так есть ли способ, которым я могу обойти это?
РЕДАКТИРОВАТЬ 2: Таким образом, после предоставления разрешений для папки у меня больше нет вывода из скрипта, файлы создаются, но это все равно занимает безумное количество времени по сравнению с запуском непосредственно на сервере.
Вот и получается, что проблема заключалась в количестве установленных шрифтов. Кажется, inkscape загружает все шрифты при запуске, и, поскольку я установил все шрифты Google, это заняло целую вечность.
Поэтому я удалил все шрифты Google, удалив их, и запустил fc-cache
обновлять.
Я также обновил с 0,48 до 0,91, что, кажется, тоже получило хороший прирост производительности. Когда у меня все еще были установлены шрифты, сценарий занимал 80 секунд при первом запуске, а во втором — только 13 секунд, где с 0,48 у меня было примерно 22/24 секунды.
Теперь сценарий выполняется менее чем за секунду, слава богу!
Еще одним улучшением стало бы выполнение обеих команд в режиме оболочки Inkscape, чтобы избежать его двойной загрузки.
Также проблема с разрешениями была вызвана SELinux и решена chcon
на .config
папка в домашнем каталоге пользователя apache
Других решений пока нет …