Как предварительно загрузить Gimp в память веб-сервера?

У меня есть веб-страница обрезки, которая позволяет пользователям загружать изображения, настраивать пропорции, уменьшать / увеличивать область обрезки и обрезать. Фактическая обрезка производится php скрипт, который вызывает Gimp из командной строки.

Система работает отлично. Но только загрузка Gimp была измерена в ~ 8 секунд. Я хотел бы уменьшить это.

По своему опыту я знаю, что если я загружаю Gimp в один терминал, загрузка занимает 8 секунд. Если я затем загружаю другое изображение в Gimp, время загрузки значительно сокращается. Я хотел бы применить это к apache2’s APACHE_RUN_USER, который является именем пользователя, под которым работает веб-сервер.

Есть ли способ получить apache2? APACHE_RUN_USER загрузить Gimp? У меня есть скрипт, который будет загружать GIMP и просто сидеть:

#!/bin/bash

gimp -i -b - >/dev/null 2&1
read -n 1 INPUT

Но я понятия не имею, как это реализовать или даже если это возможно. Может кто-нибудь, пожалуйста, дайте мне немного понимания?

1

Решение

Интересный вопрос! Gimp включает в себя TCP Скрипт-Фу сервер что мы можем запустить из командной строки:

gimp -i -b '(plug-in-script-fu-server 1 "127.0.0.1" 10008 "/path/to/log")'

Это запускает безголовый сервер, который прослушивает 127.0.0.1 через порт 10008. Это тот же сервер, который мы можем запустить через пользовательский интерфейс в Фильтры → Script-Fu → Запустить сервер …. Вы можете попробовать добавить -d возможность пропустить шаблоны загрузки, градиенты, палитры и кисти, или -f возможность пропустить шрифты (для более быстрого запуска и меньшего использования памяти). Затем мы можем отправить операторы Script-Fu, написанные на схеме, в этот сокет. Вот как с PHP:

$script = '(gimp-message "Hello Gimp!")';

$scriptLength = strlen($script);
$highByte = (int)($scriptLength / 256);
$lowByte = $scriptLength % 256;
$packet = pack('C3a*', ord('G'), $highByte, $lowByte, $script);
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_connect($socket, '127.0.0.1', 10008) or die('connect error');
socket_write($socket, $packet, strlen($packet)) or die('write error');
socket_close($socket);

Это реализует (действительно простой) протокол, определенный в этой ссылке там. Для любого серьезного использования требуется гораздо лучшая обработка ошибок, но для демонстрации это нормально. Если мы вызовем этот скрипт, мы должны увидеть информацию о соединении в файле журнала сервера, и консоль должна отобразить:

Запустите сервер-Предупреждение: Привет Gimp!

В пользовательском интерфейсе это откроет диалоговое окно с этим сообщением. В зависимости от вашей среды, Gimp или PHP могут не иметь возможности создания сокетов. Вы можете попробовать запустить оба с правами root просто чтобы проверить это.

Как бы круто это ни было, я сочувствую другим комментаторам: ImageMagick или GD могут быть лучшим выбором для большого приложения. Я слышал ваши опасения, но Gimp не предназначен для развертывания в масштабах сети. Это в первую очередь настольное приложение и использует много ресурсов. Если безопасность является проблемой, Gimp может раскрыть поверхности атаки, которые мы обычно не видим в веб-средах (включая, возможно, сервер, который выполняет произвольный код Scheme!). Вы также можете рассмотреть стоимость обслуживания собственной клиентской библиотеки, используемой для взаимодействия с Gimp.

Тем не менее, если вы можете оправдать этот проект, я думаю, что это будет очень весело.

Заметки:

  • Как вы, возможно, знаете, Gimp также включает в себя интерпретатор Python Script-Fu. Мы могли бы расширить это, чтобы создать более надежный сервер на Python.
  • Мы могли бы отнести часть улучшения времени загрузки, которое вы испытываете при запуске второго экземпляра Gimp, к кэшу файловой системы для недавно открытых файлов.
  • Gimp также использует D-Bus X11, чтобы значительно сократить время загрузки, когда экземпляр уже запущен. Эти средства могут быть недоступны в серверной среде.
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]