代码之家  ›  专栏  ›  技术社区  ›  Deanie

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

  •  1
  • Deanie  · 技术社区  · 7 年前

    我有一个裁剪网页,可以让用户上传图像,调整纵横比,缩小/扩大作物面积和作物。实际裁剪由 php 从命令行调用Gimp的脚本。

    根据经验,如果我在一个终端中加载Gimp,加载需要8秒。如果我随后将另一个图像加载到Gimp中,加载时间将大大缩短。我想把这个应用到apache2的 APACHE_RUN_USER ,这是Web服务器运行时使用的用户名。

    有没有办法拿到apache2的 APACHE\u RUN\u用户 加载Gimp?我有一个脚本,可以加载Gimp,然后直接坐下来:

    #!/bin/bash
    
    gimp -i -b - >/dev/null 2&1
    read -n 1 INPUT
    

    1 回复  |  直到 6 年前
        1
  •  2
  •   Cy Rossignol Albert    7 年前

    有趣的问题!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中编写的脚本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!

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

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

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

    笔记:

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