【问题标题】:How to use imagick with php in aws lambda?如何在 aws lambda 中使用 imagick 和 php?
【发布时间】:2017-09-27 09:07:42
【问题描述】:

目前 Amazon lambda 只支持 node.js 和 python。 我找到了一个在 lambda 中运行 php 的官方文档。链接是https://aws.amazon.com/blogs/compute/scripting-languages-for-aws-lambda-running-php-ruby-and-go/

我已经在 lambda 中成功运行了 php。但问题是我不知道如何将 imagick 与 php 一起使用。 我已经使用以下命令在我的 EC2 上安装了 imagick

sudo yum install pecl make ImageMagick ImageMagick-devel php-devel gcc re2c
sudo pecl install imagick

运行以下命令会返回我的 imagemagick 版本

convert --version

输出

Version: ImageMagick 6.7.8-9 2016-06-22 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2012 ImageMagick Studio LLC
Features: OpenMP 

我正在使用 node.js 中的 php 二进制文件运行我的 php

process.env['PATH'] = process.env['PATH'] + ':' + process.env['LAMBDA_TASK_ROOT'];

const spawn = require('child_process').spawn;

exports.handler = function(event, context,callback) {

    //var php = spawn('php',['helloLambda.php']); //local debug only
    var php = spawn('php-7-bin/bin/php',['imagick.php']);
    var output = "";

    //send the input event json as string via STDIN to php process
    php.stdin.write(JSON.stringify(event));

    //close the php stream to unblock php process
    php.stdin.end();

    //dynamically collect php output
    php.stdout.on('data', function(data) {
          output+=data;
    });

    //react to potential errors
    php.stderr.on('data', function(data) {
            console.log("STDERR: "+data);
    });

    //finalize when php process is done.
    php.on('close', function(code) {
            //context.succeed(JSON.parse(output));
            callback(null,output);
    });
}

以上 PHP 运行成功,现在我尝试通过替换 var php = spawn('php-7-bin/bin/php',['imagick.php']); 来使用 imagick 和 php;

imagick.php

$image = new Imagick('image.jpg');
$image->thumbnailImage(100, 0);
// Just trying to use imagick function

php.js

process.env['PATH'] = process.env['PATH'] + ':' + process.env['LAMBDA_TASK_ROOT'];

const spawn = require('child_process').spawn;

exports.handler = function(event, context,callback) {

    //var php = spawn('php',['helloLambda.php']); //local debug only
    var php = spawn('php-7-bin/bin/php',['imagick.php']);
    var output = "";

    //send the input event json as string via STDIN to php process
    php.stdin.write(JSON.stringify(event));

    //close the php stream to unblock php process
    php.stdin.end();

    //dynamically collect php output
    php.stdout.on('data', function(data) {
          output+=data;
    });

    //react to potential errors
    php.stderr.on('data', function(data) {
            console.log("STDERR: "+data);
    });

    //finalize when php process is done.
    php.on('close', function(code) {
            //context.succeed(JSON.parse(output));
            callback(null,output);
    });
}

但它会引发以下错误

"\nFatal error: Uncaught Error: Class 'Imagick' not found in /var/task/imagick.php:5\nStack trace:\n#0 {main}\n  thrown in /var/task/imagick.php on line 5\n"

【问题讨论】:

  • convert --version 检查 Imagemagick 是否安装而不是 Imagick。 Imagick 是 Imagemagick 的 php API,不是 Imagemagick 的一部分——据我所知,它是一个类。
  • @Bonzo 是的,它是一类 imagemagick。有没有办法在 lambda 中使用 imagemagic 和 php??
  • 我不知道 Lambda 是什么,但我在带有 php exec() 的普通服务器上使用 Imagemagick。目前这里有另一篇关于 Imagemagick 和 Lambda 的帖子:stackoverflow.com/questions/43622770/…
  • @Bonzo 请建议我在哪里可以找到在 php 中使用 imagick 和 exec() 的文档。 imagick 的所有功能都有命令吗?
  • 我建议你忘记这个特定用例的 php。你不需要它,Lambda 可以exec (spawn)。 @Bonzo Lambda 是 AWS 提供的一项服务,您的代码会自动部署在(docker?)容器中,这些容器完全交给您,自动无限扩展,对您调用的每个函数调用以 CPU 时间的几分之一秒计费。有一个与他们相同的系统映像,用于编译/测试二进制文件——但是您的代码在服务器上需要拥有的所有内容必须包含/部署在单个 zip 文件中,包括用于例如二进制文件的二进制文件。 imagemagick 甚至 php 本身。

标签: php node.js amazon-web-services amazon-ec2 aws-lambda


【解决方案1】:

如上面的 cmets 所述,Imageick 与 ImageMagick 不同(我认为,它更像是一个访问它的包装器)。亚马逊有一个blog,我相信你可能已经关注了。

我正在使用 node.js 中的 php 二进制文件运行我的 php

这意味着您已经完成了大部分任务。从上面的博客文章中,在使用./configure --prefix=/home/ec2-user/php-7-bin/ 编译 php 之前,您需要为您的 php 编译 Imagick,因此它与它捆绑在一起。但是您需要对其进行静态编译,以便将其包含在最终代码中。我相信您可能还想静态编译 ImageMagick,这样您就不必依赖已安装的那个它会一直安装。

我不再有上述两个方面的说明,我们使用 Magick.NET 走了一条不同的路线,而是用 C# 编写了我们的图像处理工具。使用 Imagick 和 Magick.NET 在 php 中使用的方法很容易转换,但它也取决于您的其他环境。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-10
    • 2012-01-17
    • 2017-06-20
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 2013-08-21
    相关资源
    最近更新 更多