如何在aws lambda中将imagick与php结合使用?

如何在aws lambda中将imagick与php结合使用?,php,node.js,amazon-web-services,amazon-ec2,aws-lambda,Php,Node.js,Amazon Web Services,Amazon Ec2,Aws Lambda,目前Amazon lambda只支持node.js和python。 我找到了一个在lambda中运行php的官方文档。链接是 我已经成功地在lambda中运行了php。但问题是我不知道如何将imagick与php结合使用。 我已使用以下命令在我的EC2上安装了imagick sudo yum install pecl make ImageMagick ImageMagick-devel php-devel gcc re2c sudo pecl install imagick 运行以下命令将返回

目前Amazon lambda只支持node.js和python。 我找到了一个在lambda中运行php的官方文档。链接是

我已经成功地在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"

正如上面的评论所述,Imageick与ImageMagick不同(我认为,它更像是访问它的包装器)。亚马逊有一个我相信你可能已经遵循的方法

我正在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);
    });
}
这意味着你在那里的大部分时间。从上面的博文中,在使用
/configure--prefix=/home/ec2 user/php-7-bin/
编译php之前,您需要为php编译Imagick,因此它与php捆绑在一起。但您需要静态编译它,以便它包含在最终代码中。我相信您可能也希望静态编译ImageMagick,这样您就不必依赖于安装的ImageMagick,它将始终安装


我再也没有上述两种方法的说明了,我们使用Magick.NET采用了不同的方法,而是用C#编写了图像处理工具。php中使用Imagick和Magick.NET的方法很容易转换,但也取决于环境的其他部分

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