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

How to pre-load Gimp into webserver's memory?

我有一个裁剪网页,可以让用户上传图片、调整纵横比、shrink/grow 裁剪区域和裁剪。实际裁剪是由 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

但我不知道如何实现它,甚至不知道它是否可能。有人可以给我一些见解吗?

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

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

这将启动一个无头服务器,它在 127.0.0.1 的端口 10008 上侦听。它与我们可以通过 Filters → Script-Fu → Start Server 下的 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);

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

Start Server-Warning: Hello Gimp!

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

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

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

备注:

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