如何在aws lambda中将imagick与php结合使用?
目前Amazon lambda只支持node.js和python。 我找到了一个在lambda中运行php的官方文档。链接是 我已经成功地在lambda中运行了php。但问题是我不知道如何将imagick与php结合使用。 我已使用以下命令在我的EC2上安装了imagick如何在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 运行以下命令将返回
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本身的二进制文件。