在MacOS 安裝PHP Imagick extension for XAMPP

更新: 你應該使用Docker

筆者最近寫了一個Single Page Application, 伺服器端對PDF 檔案進行一些操作, 例如讀取PDF 頁數、輸出成JPG 圖檔等, 都需要用到ImageMagick 這套軟件。

在PHP 使用ImageMagick 需要安裝一個名叫Imagick 的extension, 想不到安裝及解難的過程花了筆者兩天, 特此紀錄, 希望幫到其他人。

以下教學基於全新安裝的MacOS 10.12.5, XAMPP 5.6.30, 只供參考。

  1. 安裝Homebrew。Homebrew 是MacOS 的套件管理工具, 相當於Debian Linux 上的apt。
  2. 安裝ImageMagick: brew install imagemagick
  3. 安裝PHP Imagick Extension: brew install homebrew/php/php56-imagick
  4. /Applications/xampp/etc/php.ini新增以下句子, 意思是指示Apache 載入Imagick extension:
extension = /usr/local/Cellar/php56-imagick/3.4.3_3/imagick.so

5. 重新啟動Apache, 查看phpinfo()有沒有Imagick 部分, 應該是沒有的。

6. 查看/Applications/XAMPP/xamppfiles/logs/php_error_log, 發現Imagick extension 需要更新版本的libfreetype.6.dylib

7. 使用otool -L /usr/local/Cellar/freetype/2.8/lib/libfreetype.6.dylib查看本機的libfreetype.6.dylib版本, 如果足夠新的話複製到/Applications/xampp/xamppfiles/lib/

8. 重新啟動Apache, 這次應該能成功載入。

不過難關又豈止一個, 讀取PDF 需要用到Ghostscript:

brew install ghostscript

安裝後同樣無法讀取PDF:

Uncaught ImagickException: Failed to read the file in ...

解決方法:

  1. 重新開機時壓下Cmd + R直至聽到開機聲音。
  2. 進入Recovery Mode 後選擇 Utilities -> Terminal。
  3. 輸入csrutil disable關閉System Integrity Protection。
  4. 正常重新開機。
  5. 在終端機輸入sudo ln -s /usr/local/bin/gs /usr/bin/gs
  6. 重做1 及2, 輸入csrutil enable重新開啟System Integrity Protection。

最後, Production Server 使用的是Debian Linux, 使用apt-get install php5-imagick安裝的版本比較舊, 需要先安裝PECL 再安裝Imagick Extension, 不過這是後話了。

A JavaScript/Node/Flutter developer who love technical stuffs.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store