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

标签 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

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

最佳答案

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

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

这会启动一个 headless 服务器,它会在 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);

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

Start Server-Warning: Hello Gimp!

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

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

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

注意事项:

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

关于php - 如何将 Gimp 预加载到网络服务器的内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46435013/

相关文章:

php - 编写自定义查询来获取 WordPress 数据/使用 WordPress 表创建 JSON

php - 如何处理可能有重复条目的 PDO 事务

linux - 更改目录在 Linux 中搜索程序的顺序

java - 在 javafx 中问题加载图像的相对路径

c# - 从 C# 中的路径拆分文件名和扩展名

php - 是否可以从 HTML 表单(复选框)发布多个 "values"?

catch : how to handle it? 内的 PHP 异常

c++ - Kworker 线程被 SCHED_RR 用户空间线程阻塞

linux - 一个支持压缩、加密、保留权限和快速检索文件的归档器

jquery - 如何设置jquery创建的内容的图像宽度