node.js — Как использовать imagick с php в aws лямбда?

В настоящее время Amazon lambda поддерживает только node.js и python.
Я нашел официальный документ для запуска php в lambda. ссылка https://aws.amazon.com/blogs/compute/scripting-languages-for-aws-lambda-running-php-ruby-and-go/

Я успешно запустил php в лямбде. Но проблема в том, что я не знаю, как использовать imagick с php.
Я установил imagick на EC2 с помощью следующих команд

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

Я запускаю свой php с бинарниками php в node.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);
});
}

Выше PHP успешно работает, теперь я пытаюсь использовать imagick с php, заменив var php = spawn (‘php-7-bin / bin / 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"

2

Решение

Как указано в комментариях выше, Imageick отличается от ImageMagick (ну, это скорее обертка для доступа к нему, я считать). Амазонка есть блог что я верю, что вы, возможно, следовали.

Я запускаю свой php с бинарниками php в node.js

Что означает, что вы большую часть пути туда. Из приведенного выше сообщения в блоге, прежде чем идти компилировать php с ./configure --prefix=/home/ec2-user/php-7-bin/ вам нужно скомпилировать Imagick для вашего PHP, так что он в комплекте с ним. Но вам нужно скомпилировать его статически, чтобы он был включен в окончательный код. Я полагаю, что вы также можете скомпилировать ImageMagick статически, поэтому вам не нужно полагаться на тот, который установлен, он всегда будет установлен.

У меня больше нет инструкций по обоим вышеперечисленным, мы пошли другим путем с Magick.NET и вместо этого написали наш инструмент для работы с изображениями на C #. Методы, используемые в php с Imagick и с Magick.NET, были легко конвертируемыми, но это также зависит от остальной части вашей среды.

0

Другие решения

Других решений пока нет …