У меня есть веб-страница обрезки, которая позволяет пользователям загружать изображения, настраивать пропорции, уменьшать / увеличивать область обрезки и обрезать. Фактическая обрезка производится 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
Но я понятия не имею, как это реализовать или даже если это возможно. Может кто-нибудь, пожалуйста, дайте мне немного понимания?
Интересный вопрос! 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.
Тем не менее, если вы можете оправдать этот проект, я думаю, что это будет очень весело.
Заметки:
Других решений пока нет …