【发布时间】: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