Должен ли я использовать расширение PHP для ImageMagick или просто использовать функцию PHP Exec() для запуска команд терминала?
Мне нужно выполнить следующие манипуляции с изображениями для изображений, загруженных пользователями на моем сайте:
- Изменить размер изображения (если оно больше определенного размера)
- Конвертировать все форматы изображений в JPG
- Добавить водяной знак внизу всех изображений
Нужно ли мне использовать расширения MagickWand или iMagick или мне просто не нужно запускать команды терминала внутри функции exec PHP?
Есть ли причина, по которой расширения PHP предпочтительнее? Что будет быстрее и лучше для производительности (на этом сайте может быть много пользователей, и в любой момент времени будет выполняться обработка изображений)?
3 ответа
Вы бы много выиграли от использования расширений PHP вместо использования exec или подобных функций. Встроенные расширения будут работать быстрее и использовать меньше памяти, поскольку вам не придется создавать новые процессы и считывать вывод обратно. Объекты изображений будут напрямую доступны в PHP вместо необходимости читать вывод файла, что должно упростить работу с изображениями.
Если у вас загруженный сайт, создание большого количества процессов для редактирования изображений может замедлить процесс и потреблять дополнительную память.
Я хотел бы сделать контрапункт к ответу drew010. В своем ответе он заявляет:
Вы бы много выиграли от использования расширений PHP вместо использования exec или подобных функций. Встроенные расширения будут работать быстрее и использовать меньше памяти, так как вам не придется создавать новые процессы и читать вывод обратно
Для обработки изображений это правда. Ну, я точно знаю, что вызов двоичных файлов ImageMagick с использованием PHP exec()
Функция (или аналогичные функции) несет в себе дополнительные издержки, связанные с использованием встроенных библиотек PHP, однако мне не ясно, сколько там накладных расходов.
Но есть и другая сторона медали. Если вы встраиваете код ImageMagick в PHP через расширение, то каждый запрос с использованием PHP занимает больше памяти, независимо от того, обрабатывает ли запрос изображение или нет. Если вы используете Apache mod_php
тогда это становится еще более серьезной проблемой, потому что теперь каждый запрос к вашему серверу имеет библиотеки ImageMagick в памяти, даже если он обслуживает файл HTML!
Так что это действительно зависит. Вы действительно хотите сохранить как можно меньше памяти в PHP. Если вы обрабатываете большое количество запросов, требующих ImageMagic, и используете FastCGI или php_fpm
, тогда вы, вероятно, увидите выгоду от использования встроенного ImageMagick. Но если вы только изредка обрабатываете запросы, используя ImageMagick и / или используя Apache mod_php
тогда вы можете получить гораздо лучшую производительность, вызывая ImageMagick через exec()
,
Я всегда использую PHP GD http://php.net/manual/en/book.image.php
Вы можете выполнить изменение размера, преобразование в JPG и нанесение водяных знаков на ваши изображения. Я знаю, что в вашем сообщении говорилось, что вы должны использовать MagickWand или iMagick, но я просто хотел представить эту опцию на случай, если она будет работать для вас.