Overview

안녕하세요. imagick을 설정할 때마다 고통받고 있는
브랜디 개발자 강원우입니다.

imagick은 PHP의 이미지 처리 라이브러리로 속도는 약간 떨어지지만, 적은 메모리 사용량과 좋은 화질의 이미지 처리 결과를 얻을 수 있어서 PHP에서 주로 사용하는 라이브러리입니다.

그런데 해당 라이브러리는 몇 가지 제약조건이 있어서 프로젝트를 구성할 때마다 개발자들을 고통받게 하는데요. imagick.so, imagick.la, freetype.a, freetype.la 등이 바로 그것입니다.

어째서 고통스러운지 확장자부터 살펴보겠습니다.

[각 확장자별 간략 설명]

  • *.so : 유닉스 계열 동적 라이브러리
  • .a : 유닉스 계열 정적 라이브러리
  • *.la : GNU libtools에서 사용하는 라이브러리 연결용 설명 파일

위의 라이브러리들은 C 기반입니다(?).
다른 말로 하면 해당 라이브러리 소스를 컴파일 해서 제작하는 파일이라는 것이죠!

즉, 컴파일 되어 있기 때문에 IDE에서 열리지 않고(열어도 알아볼 수 없는 문자들만 가득) 도무지 어떤 라이브러리와 종속성이 있는지, 어떤 라이브러리를 요구하는지 알 길이 없습니다.

콘솔에 에러로그라도 시원하게 찍혀주면 좋으련만, xampp 내부의 php 로그를 뒤적여 보아도 어떤 라이브러리가 로드되지 않았습니다. 정도의 간략한 로그만 남기 때문에 여러 개발자들의 심박수를 증가시켜주게 됩니다.

php_error_log 예시

[17-Sep-2020 07:52:16 Europe/Berlin] PHP Warning:  PHP Startup: Unable to load dynamic library '/Applications/XAMPP/xamppfiles/lib/php/extensions/no-debug-non-zts-20131226/imagick.so' - dlopen(/Applications/XAMPP/xamppfiles/lib/php/extensions/no-debug-non-zts-20131226/imagick.so, 9): Library not loaded: /usr/local/opt/imagemagick/lib/libMagickWand-7.Q16HDRI.3.dylib
  Referenced from: /Applications/XAMPP/xamppfiles/lib/php/extensions/no-debug-non-zts-20131226/imagick.so
  Reason: image not found in Unknown on line 0

(아니!! 그러니까 도대체 왜! 그 라이브러리를 실행할 수 없는 거지??! 누가 설명 좀..)

그렇게 저는 과거 2018년 초 많은 개발자를 힘들게 했고, 저 또한 늪에 빠져 허우적거리게 만들었던 PHP용 image magick의 설정을 돕고자 ‘[image magick의 늪에서 벗어나는 방법]‘에 관한 글을 작성했었습니다.

해당 글은 imagick.so 에서 참조하는 libfreetype 라이브러리를 makefile 명령어를 통해 컴파일해 낼 수 있는 도구에 기반으로 작성된 가이드로, 자신의 xampp에서 사용하는 imagick 라이브러리의 버전만 확인할 수 있으면 알맞은 libfreetype 라이브러리를 생성해 낼 수 있던 공략집이었습니다.

그러나 시간이 흘러 위 가이드 글의 핵심 라이브러리 중 하나인 FreeType 라이브러리 컴파일 가이드 사이트가, 디지털 풍화작용에 의하여

폐쇄되었습니다 …

imagick
맙소사 RIP


해당 글의 원고 격인 가이드 프로젝트 작성 시점에 브랜디에서는 개발자 인력 충원에 총력을 가하고 있었고, 정말 생각지도 못한 일이 발생해 버려서 부랴부랴 기존 제작 파일들을 백업하고,
서둘러 신버전 설정 가이드를 준비하게 되었습니다.

때마침 XAMPP도 PHP 5.6의 마지막 버전으로 예상되는 5.6.40 버전이 거의 1년 만에
업데이트되었더군요. (구 버전 세팅 가이드 당시 xampp 버전은 5.6.32)

XAMPP의 버전업 덕분인지 세팅이 이전보다 많이 간단(?)해졌습니다.
단, 주의사항이 있습니다. 정말 사소한 것 하나하나 똑같이! 따.라.하.셔.야 합니다.
(그렇지 않으면 imagick의 늪에서 벗어나지 못할 수도 있습니다. - 제가 직접 작성한 글을 보고도 설정 못했던 경험담 )

Version

먼저 설정에 성공한 환경정보를 공유드립니다.

  • OS : Catalina 10.15.6
  • XAMPP : 5.6.40-1 (PHP 5.6.40 XAMPP 자체 PHP)
  • libpng : 1.6.36
  • imagemagick : 7.0.6-4
  • freetype: 2.10.1

1. xampp를 설치해 줍니다.

[XAMPP Link] (https://sourceforge.net/projects/xampp/files/XAMPP Mac OS X/5.6.40/)

imagick


2. 필요 라이브러리 설치를 위해 homebrew를 설치합니다.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"


3. homebrew를 이용하여 libpngfreetype을 설치합니다.

brew install libpng freetype


4. 설정에 필요한 파일을 다운로드 합니다.

[설정을 위한 파일 모음.zip] (https://drive.google.com/file/d/184hbBId5DV5vQZH82CwxvkNJ4PDATabp/view?usp=sharing)

5. 다운로드한 파일을 각각 알맞은 위치에 배치합니다.

(libfreetype, xdebug.so 두 파일은 대체 시킵니다.)

xampp 내부 imagick 관련 파일

파일명 경로 버전 비고
imagick.so /Applications/XAMPP/xamppfiles/lib/php/extensions/no-debug-non-zts-20131226/imagick.so freetype 버전과 맞춰 빌드한 php56-imagick 라이브러리
xdebug.so /Applications/XAMPP/xamppfiles/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so mac에서 빌드한 xdebug 확장라이브러리
xdebug.la /Applications/XAMPP/xamppfiles/lib/php/extensions/no-debug-non-zts-20131226/xdebug.la mac에서 빌드했을떄 같이 생성된 파일

xampp 내부 libfreetype 관련 파일

파일명 경로 버전 비고
libfreetype.6.dylib /Applications/XAMPP/xamppfiles/lib/libfreetype.6.dylib 21.0.0^ homebrew 설치 버전은 15.0.0 이여서 작동 안함
libfreetype.a /Applications/XAMPP/xamppfiles/lib/libfreetype.a 21.0.0^
libfreetype.dylib /Applications/XAMPP/xamppfiles/lib/libfreetype.dylib 21.0.0^ symlink 로 보임
libfreetype.la /Applications/XAMPP/xamppfiles/lib/libfreetype.la 21.0.0^

mac 라이브러리 파일 폴더 압축 - 3번 항목을 먼저 수행해야 합니다.

폴더명 경로 버전 비고
imagemagick /usr/local/Cellar/imagemagick/ 7.0.6-4 xampp에 추가한 imagick.so 확장 프로그램이 버전을 탐 (7.0.6-4)
freetype /usr/local/Cellar/freetype/ 2.10.1 xampp의 imagick.so 는 xampp내부 freetype.dylib를 바라보고, imagick.so가 참조하는 /usr/local/Celler/imagemagick은 /usr/local/Celler/freetype을 바라봄


위의 파일 목록 설명 테이블 markdown 소스 (github 블로그용 작성양식)

### xampp 내부 imagick 관련 파일

|파일명|경로|버전|비고|
|---|---|---|---|
| imagick.so | /Applications/XAMPP/xamppfiles/lib/php/extensions/no-debug-non-zts-20131226/imagick.so |  | freetype 버전과 맞춰 빌드한 php56-imagick 라이브러리 |
| xdebug.so | /Applications/XAMPP/xamppfiles/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so |  | mac에서 빌드한 xdebug 확장라이브러리 |
| xdebug.la | /Applications/XAMPP/xamppfiles/lib/php/extensions/no-debug-non-zts-20131226/xdebug.la |  | mac에서 빌드했을떄 같이 생성된 파일 |

<br>

### xampp 내부 libfreetype 관련 파일

|파일명|경로|버전|비고|
|---|---|---|---|
| libfreetype.6.dylib | /Applications/XAMPP/xamppfiles/lib/libfreetype.6.dylib | 21.0.0^ | homebrew 설치 버전은 15.0.0 이여서 작동안 |
| libfreetype.a | /Applications/XAMPP/xamppfiles/lib/libfreetype.a | 21.0.0^ | |
| libfreetype.dylib | /Applications/XAMPP/xamppfiles/lib/libfreetype.dylib | 21.0.0^ | symlink 로 보임 |
| libfreetype.la | /Applications/XAMPP/xamppfiles/lib/libfreetype.la | 21.0.0^ | |

<br>

### mac 라이브러리 파일 폴더 압축 - 3번 항목을 먼저 수행해야 합니다.

|폴더명|경로|버전|비고|
|---|---|---|---|
| imagemagick | /usr/local/Cellar/imagemagick/ | 7.0.6-4 | xampp에 추가한 imagick.so 확장 프로그램이 버전을 탐 (7.0.6-4) |
| freetype | /usr/local/Cellar/freetype/ | 2.10.1 | xampp의 imagick.so 는 xampp내부 freetype.dylib를 바라보고, imagick.so가 참조하는 /usr/local/Celler/imagemagick은 /usr/local/Celler/freetype을 바라봄 |

<br><br>


6. high sierra 이후 생긴 미확인 개발자 방지 옵션을 끕니다.

sudo spctl --master-disable
# 다시 켤때는 sudo spctl --master-enabl


7. freetype을 설치하며 자동으로 연결된 imagemagick 심볼릭 링크를 제거합니다.

cd /usr/local/opt/
rm imagemagick


8. imagemagick의 심볼릭 링크를 배치한 파일로 연결해 줍니다.

cd /usr/local/opt/
ln -s /usr/local/Cellar/imagemagick/7.0.6-4 imagemagick


9. 잘 연결 됐는지 확인

ls -al
#/usr/local/Cellar/imagemagick/7.0.6-4 => /usr/local/opt/imagemagick


10. xampp의 php.ini 수정

파일의 경로는 별다른 설정 없이 설치했을 경우의 경로입니다.

  • 위치 : /Applications/XAMPP/xamppfiles/etc/php.ini
... 생략

[imagick]
extension="imagick.so"

# 필자는 아래 comment 위쪽에 추가
;;;;;;;;;;;;;;;;;;;
; Module Settings ;
;;;;;;;;;;;;;;;;;;;

... 생략


etc.

  1. 가상 호스트를 사용하려면 httpd.conf의 httpd-vhosts.conf를 사용하도록 설정해 주세요.
  2. hosts는 원하는 url로 수정해 주세요

11. 결과 확인 및 실제 압축 테스트

여기까지가 Imagick PHP Extension 설치 가이드 V1보다 비교적 간단해진(?) imagick 설정 방법입니다.

(기존 방식은 freetype을 직접 빌드해야 했습니다..)

11-1. 이제 정상적으로 등록되었는지 phpinfo에서 확인합니다.

imagick
따란~

imagick 라이브러리가 성공적으로 로드되었습니다!

11-2. 정상적으로 동작하는지 한번 이미지를 압축해보겠습니다.

이미지 압축 전후 사이즈 비교를 통해 테스트를 진행합니다.

  1. php 테스트 소스코드 (화면단에 출력하는 부분은 생략합니다.)
# 이미지 라이브러리 테스트
$image = new Imagick();
# 브랜디 로고 이미지로 테스트
$resource = file_get_contents('[로고 이미지 URL]');
$image->readImageBlob($resource);

# 압축 전 이미지 사이즈
$originImageSize = $image->getImageLength();

# 압축 수행
$image->resizeImage(100, 0, Imagick::FILTER_LANCZOS, 1);
$image->setImageCompression(Imagick::COMPRESSION_JPEG);
$image->setImageCompressionQuality(80);
$image->stripImage();
$thumbSource = $image->getImageBlob();

# 압축 후 이미지 사이즈
$compressedImageSize = $image->getImageLength();

# 이미지 제거
$image->destroy();


11-3. 결과 확인

imagick

성공적으로 동작하여 이미지 사이즈가 줄어들었습니다!!

Conclusion

PHP 5.6의 지원이 끊기면서 해당 버전에 종속적인 라이브러리들의 유지 보수도 점차 끊어져 가고 있습니다. 하지만 해당 버전의 지원이 끊긴다고 해서 우리의 레거시 프로젝트 소스가 버전업 되는 것은 아니지요!

필자는 PHP 5.6환경에 imagick을 설정하는 것이 벌써 4번째입니다만.. 항상 너무 고통스러웠습니다.

지금까지 설정 성공 최단 기록이 4시간 반입니다. 다른 분들은 부디 이렇게 고생하지 않기를 기원하며,

그리고 PHP 5.6 이미지 라이브러리 세팅 가이드는 V2가 마지막이길 기원하며,

이 글을 마칩니다.


강원우 | 커머스 개발팀
kangww@brandi.co.kr
브랜디, 오직 예쁜 옷만