如何将Gimp预加载到网络服务器的内存中?

时间:2017-09-26 20:12:26

标签: php linux image image-processing gimp

我有一个裁剪网页,可让用户上传图片,调整宽高比,缩小/增加裁剪区域和裁剪。实际裁剪由php脚本完成,该脚本从命令行调用Gimp。

系统完美运行。但是,只需加载Gimp就可以测量~8秒。我想减少这个。

据我所知,如果我在一个终端加载Gimp,加载需要8秒。如果我然后将另一个图像加载到Gimp中,则加载时间会大大减少。我想将此应用于apache2的APACHE_RUN_USER,这是网络服务器运行的用户名。

有没有让apache2的APACHE_RUN_USER加载Gimp?我有一个脚本将加载Gimp并且只是坐下:

#!/bin/bash

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

但我不知道如何实现这一点,即使它是可能的。有人可以给我一些见解吗?

1 个答案:

答案 0 :(得分:2)

有趣的问题! Gimp包含一个TCP Script-Fu server,我们可以从命令行运行:

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

这启动了一个无头服务器,它在端口10008上侦听127.0.0.1。它是我们可以通过过滤器→脚本 - 傅立即启动服务器... 下的UI启动的服务器。您可以尝试添加-d选项以跳过加载模式,渐变,调色板和画笔,或添加-f选项以跳过字体(以便更快地启动和降低内存使用)。然后我们可以将用Scheme编写的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);

这实现了那个链接中定义的(非常简单的)协议。对于任何严肃的用途,它需要更好的错误处理,但它对于演示来说很好。如果我们调用此脚本,我们应该在服务器日志文件中看到连接信息,控制台应该显示:

  

启动服务器 - 警告:Hello Gimp!

在UI中,这将打开一个包含该消息的对话窗口。根据您的环境,Gimp或PHP可能没有套接字创建功能。您可以尝试以root 运行两者来测试它。

尽管很酷,我也很同情其他评论者:ImageMagick或GD可能是大型应用程序的更好选择。我听到了您的担忧,但Gimp并非专为网络规模部署而设计。它最重要的是桌面应用程序并使用大量资源。如果担心安全问题,Gimp可能会暴露我们通常在Web环境中看不到的攻击面(可能包括执行任意Scheme代码的服务器!)。您可能还想考虑维护用于与Gimp交互的本地客户端库的成本。

那就是说,如果你能证明这个项目的合理性,我认为这会很有趣。

注意:

  • 您可能知道,Gimp还包含一个Python Script-Fu解释器。我们可以扩展它以在Python中创建更强大的服务器。
  • 我们可以将运行第二个Gimp实例时遇到的部分加载时间改进归因于最近访问过的文件的文件系统缓存。
  • Gimp还利用X11的D-Bus显着改善实例运行时的加载时间。这些设施可能无法在裸服务器环境中使用。