PHP и Imagick под Windows

grey109

Новичок
Приветствую всех!

Чувствую, сейчас закидают тухлыми помидорами, но ничего не поделаешь, буду держать оборону :)

И так, есть специфический проект написанный на php, который активно использует Imagick. Все это дело крутится под Windows Server 2016. Для работы с графикой на php используется библиотека imagick версии 3.4.4 от 2019 года с сайта https://windows.php.net/downloads/pecl/releases/imagick/ . В ней присутствуют некоторые ошибки, а также отсутствует поддержка некоторых нужных графических форматов. Отказаться от Винды нет возможности, новых версий не выходило и наверно не будет (я спрашивал у автора), потому приходиться искать какие-то обходные пути.

Подскажите, есть ли на форуме те, кто тоже использует Imagick под виндой? Может кто-то собирал библиотеку под свои нужны из свежих исходников или насколько это реально сделать самому без опыта? Может есть какая-то другая альтернатива imagick под Виндой?

Спасибо.

PS: наверно вы скажите, и будете правы, что понятие вебсервера и винды не совместимы, но я имею то что имею, потому прошу помощи у клуба.
 

fixxxer

К.О.
Партнер клуба
новых версий не выходило и наверно не будет (я спрашивал у автора)
Тогда проще всего обновиться до Windows Server 2019, установить WSL, и запускать в WSL нормальные линуксовые билды.

imagemagick - это огромный комбайн, связывающий сотню библиотек, его даже под линуксом собрать не так просто, а под виндой вообще вряд ли кто-то кроме автора способен это сделать.

Альтернативный вариант - попробовать мотивировать автора финансово.
 

AnrDaemon

Продвинутый новичок
Вы путаете ImageMagick и php_imagick.

Версия PHP у вас какая?
 

grey109

Новичок
Нет, я ничего не путаю :) Одного php_imagick.dll для работы мало, нужна еще сама программа или набор библиотек ImageMagick.

PHP 7.4.x
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
может быть, я чего-то не понимаю, объясни чего именно
никому то расширение и не нужно особо, не просто ж так на него забили
с imagemagic по жизни работали, вызывая его как бинарник, потому что либа течет, а ovehead на фоне затрат на обработку картинки вообще незаметен

посему, варианта два
1. качаешь официальную сборку imagemagic https://imagemagick.org/script/download.php#windows
специально для нас написали: Portable Win64 static. Just copy to your host and run
переписываешь вызовы php_imagick на exec()
profit для компании

2. точно так же качаешь официальную сборку, но потом упарываешься с FFI и пишешь свою обертку на PHP,
ощущаешь прилив ЧСВ, пишешь статью на хабр и reddit какой-нибудь, выступаешь на стримах, рассказываешь как phpclub совсем слился,
меняешь работу, где SDLC получше
profit для тебя

конечно, 2й пункт можно проделать и без imagic, но если есть порыв упроться на не особо нужную, но прикольную тему - можно сделать это за счет конторы
 

AnrDaemon

Продвинутый новичок
Код:
imagick

imagick module => enabled
imagick module version => 3.4.4
imagick classes => Imagick, ImagickDraw, ImagickPixel, ImagickPixelIterator, ImagickKernel
Imagick compiled with ImageMagick version => ImageMagick 7.0.7-11 Q16 x64 2017-11-23 http://www.imagemagick.org
Imagick using ImageMagick library version => ImageMagick 7.0.9-27 Q16 x64 2020-02-29 http://www.imagemagick.org
ImageMagick copyright => Copyright (C) 1999-2018 ImageMagick Studio LLC
ImageMagick release date => 2020-02-29
ImageMagick number of supported formats:  => 250
ImageMagick supported formats => 3FR, 3G2, 3GP, AAI, AI, ART, ARW, AVI, AVS, BGR, BGRA, BGRO, BIE, BMP, BMP2, BMP3, BRF, CAL, CALS, CANVAS, CAPTION, CIN, CIP, CLIP, CLIPBOARD, CMYK, CMYKA, CR2, CR3, CRW, CUBE, CUR, CUT, DATA, DCM, DCR, DCRAW, DCX, DDS, DFONT, DJVU, DNG, DOT, DPS, DPX, DXT1, DXT5, EMF, EPDF, EPI, EPS, EPS2, EPS3, EPSF, EPSI, EPT, EPT2, EPT3, ERF, EXR, FAX, FILE, FITS, FLIF, FLV, FPX, FRACTAL, FTP, FTS, G3, G4, GIF, GIF87, GRADIENT, GRAY, GRAYA, GROUP4, GV, HALD, HDR, HEIC, HISTOGRAM, HRZ, HTM, HTML, HTTP, HTTPS, ICB, ICO, ICON, IIQ, INFO, INLINE, IPL, ISOBRL, ISOBRL6, J2C, J2K, JBG, JBIG, JNG, JNX, JP2, JPC, JPE, JPEG, JPG, JPM, JPS, JPT, JSON, JXL, K25, KDC, LABEL, M2V, M4V, MAC, MAP, MASK, MAT, MATTE, MEF, MIFF, MKV, MNG, MONO, MOV, MP4, MPC, MPEG, MPG, MRW, MSL, MSVG, MTV, MVG, NEF, NRW, NULL, ORF, OTB, OTF, PAL, PALM, PAM, PANGO, PATTERN, PBM, PCD, PCDS, PCL, PCT, PCX, PDB, PDF, PDFA, PEF, PES, PFA, PFB, PFM, PGM, PGX, PICON, PICT, PIX, PJPEG, PLASMA, PNG, PNG00, PNG24, PNG32, PNG48, PNG64, PNG8, PNM, POCKETMOD, PPM, PS, PS2, PS3, PSB, PSD, PTIF, PWP, RADIAL-GRADIENT, RAF, RAS, RAW, RGB, RGB565, RGBA, RGBO, RGF, RLA, RLE, RMF, RW2, SCR, SCREENSHOT, SCT, SFW, SGI, SHTML, SIX, SIXEL, SPARSE-COLOR, SR2, SRF, STEGANO, SUN, SVG, SVGZ, TEXT, TGA, THUMBNAIL, TIFF, TIFF64, TILE, TIM, TM2, TTC, TTF, TXT, UBRL, UBRL6, UIL, UYVY, VDA, VICAR, VID, VIFF, VIPS, VST, WBMP, WEBP, WMF, WMV, WPG, X3F, XBM, XC, XCF, XPM, XPS, XV, YCbCr, YCbCrA, YUV

Directive => Local Value => Master Value
imagick.locale_fix => 0 => 0
imagick.progress_monitor => 0 => 0
imagick.skip_version_check => 1 => 1
Каких форматов нехватает?
 

grey109

Новичок
потому что либа течет
Это что значит? Утечка памяти имеет место быть?

переписываешь вызовы php_imagick на exec()
Как вариант - да, но я считаю что это сильно повышает нагрузку на дисковую систему. Тут один раз прочитал картинку в память и крути-верти ее, делай с ней что хочешь в памяти, без обращения к диску. А при exec-ке при каждый операции над картинкой будет дергаться винт. Т.е. например очень грубо так:
exec ("convert 1.jpg 2.png");
exec ("применить один фильтр к 2.png")
exec ("применить сделать какую-то операцию с 2.png")
exec ("применить один фильтр к 2.png")
exec ("применить сделать какую-то операцию с 2.png")
exec ("применить один фильтр к 2.png")

Итого 6 обращений к винту на чтение и 6 на запись... Или я чего-то не так понимаю? Да, наверно можно сделать виртуальный диск и все временные операции производить на нем... Но не хочется усложнять там, где можно обойтись без этого.

ImageMagick release date => 2020-02-29
У меня версия от 2017 года, там например нет поддержки HEIC, но это решается обновлением, но что в старых версиях, что в новых есть ошибка, с которой столкнулся буквально пару дней назад - imagemagick не верно определяет анимированный гиф или нет. Например, можете проверить у себя:

// https://media.geeksforgeeks.org/wp-content/uploads/20191117145951/g4gnaimation1.gif
$file_to_grab = "g4gnaimation1.gif";
$file_handle_for_viewing_image_file = fopen($file_to_grab, 'a+');
$imagick_type->readImageFile($file_handle_for_viewing_image_file);
$image_iterations = $imagick_type->getImageIterations();

if($image_iterations == 1) print("$file_to_grab *IS* an animated image.");
else print("$file_to_grab *IS NOT* an animated image.");

У меня на всех анимированных гиф-ках пишет "*IS NOT*".
 

fixxxer

К.О.
Партнер клуба
Если это единственная проблема, анимированность гифки можно определить и ручками, это несложно.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
нагрузка на дисковую подсистему - это операции с диском, когда объем данных больше, чем оперативной памяти, а при запуске исполнимого файла чтение с диска выполняется только один раз, потом идет чтение из кеша операционной системы, и диски не затрагиваются
 

fixxxer

К.О.
Партнер клуба
Ты линуксом рассуждаешь, а у него винда, там процесс куда более тяжелая штука.
Относительный оверхед наверняка все равно более чем приемлем будет, но проверять я это, конечно, не буду.
 

AmdY

Пью пиво
Команда форума
не надо каждый раз делать exec

Bash:
convert -background lightblue -fill blue \
          -font URW-Palladio-Bold-Italic \
          -pointsize 72 label:Anthony label.gif
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Ты линуксом рассуждаешь, а у него винда, там процесс куда более тяжелая штука.
Относительный оверхед наверняка все равно более чем приемлем будет, но проверять я это, конечно, не буду.
винда не кеширует exe-шники с dll?
не верю, вернусь домой - запущу под 10кой exec('imagic.exe') в цикле, и сделаю скриншот нагрузки на диск ... только куда его залить? :)
 
Сверху