danack/imagick-contained

此软件包最新版本(dev-master)没有提供许可证信息。

dev-master 2019-05-16 13:37 UTC

This package is auto-updated.

Last update: 2024-09-17 02:03:41 UTC


README

运行 Imagick/ImageMagick 的更安全方式

简介

此容器使用 Supervisor 运行一些后台工作进程,这些工作进程将为您处理图像。

这应该会使 Imagick 的使用更加安全,因为它

  • 避免了长时间留下开放的Web请求。

  • 这意味着任何存在的漏洞都无法访问您的系统的大部分内容。

此项目目前是一个“概念验证”。它需要进行大量工作才能准备投入生产。问题在这里:https://github.com/Danack/ImagickContained/issues

添加到 docker-compose

将类似以下内容添加到您的 docker-compose 文件中。

  imagick_contained:
    build: vendor/danack/imagick_contained
    volumes:
      - ./images/input:/var/app/images/input
      - ./images/output:/var/app/images/output
      - ./lib:/var/app/lib
      - ./vendor:/var/app/vendor

告诉您的应用程序如何创建 RedisImagickTaskQueue

function createRedisImagickTaskQueue()
{
    $host = 'imagick_contained';
    $port = 6379;

    $redis = new \Redis();
    $redis->connect($host, $port);
    //$redis->auth($password);
    $redis->ping();

    return new \ImagickContained\RedisImagickTaskQueue($redis);
}

而不是直接调用 Imagick,将工作推送到队列,然后检查工作是否完成

    public function getQueuedImage(ImagickTaskQueue $imagickTaskQueue)
    {
        $number = random_int(1000000, 10000000);
        $filename = __DIR__ . "/../../../images/output/ImagickTest_$number.png";

        if (file_exists($filename) === true) {
            return new ImageResponse($filename, ImageResponse::TYPE_PNG);
        }

        $task = ImagickTask::create(
            'Example\ImagickTest::drawFilledPattern',
            [$filename]
        );

        $imagickTaskQueue->pushImagickTask($task);

        // wait for up to 1 second for the image to process
        for ($i=0; $i<200; $i++) {
            if ($imagickTaskQueue->isTaskStatusSuccess($task) === true) {
                return new ImageResponse($filename, ImageResponse::TYPE_PNG);
            }
            usleep(5000);
        }

        return new NotFoundResponse("Image still being processed");
    }