macos缺少freetype終極解決方案

NO IMAGE

最近在用 thinkphp,用到驗證碼模組時,驗證碼無法正確顯示,log 中錯誤資訊如下:

Call to undefined function think\captcha\imagettftext()[/Users/leif/web/login-test/vendor/topthink/think-captcha/src/Captcha.php:191]

大致意思就是沒有 imagettftext()這個函式,這是因為缺少 php 的 gd 庫中的 freetype 模組。

網上的解決方案大致有這麼幾種:

但這些方案都比較老了,無法解決 macos 10.11和 macos 10.12的問題,
因為macos 在2015年下半年修改了安全策略,如果你看了 wwdc 2015的話可能會想起來,或者可以點這檢視回顧

如果你只是想快點解決問題的話,我就給你簡單解釋一下這個安全策略,這種策略叫做Rootless機制,就是 root使用者也無法操作某些系統關鍵部位,例如php 的目錄/usr/bin,這就導致以上三種方式根本行不通,他們無法修改 php的預設指向,現我給出兩種解決途徑:

  • 使用第三方整合環境,推薦 mamp和 mamp pro,xampp 也可以
  • 關閉Rootless機制,然後自己配置環境

我採用了第二種方式,(ps,有點追求就得采用第二種方式吧。。。)

關閉Rootless機制的方法為:

//重啟按住 Command R,進入恢復模式,開啟Terminal。
csrutil disable

修改好了之後還可以選擇再次開啟,開啟的方式為:

//重啟按住 Command R,進入恢復模式,開啟Terminal。
csrutil enable

好,現在你已經成功的把Rootless機制給關掉了,然後就可以從以下三種方式中選擇一種了

我選擇的是第二種,
方法為:

brew install php56 --with-apche --with-freetype

這裡的 php56,也可以換成你想要的版本,後邊的外掛也可以自己隨便換,但是一定要有--with-freetype(這不廢話麼,,,老子就是想裝這個的。。。)使用方法也很簡單,就不贅述了,百度搜尋 “brew 安裝php”有很多教程

最重要的一點一定要記住,在安裝完成後,會出現一段文字,內容大致為

To enable PHP in Apache add the following to httpd.conf and restart Apache:
LoadModule php5_module    /usr/local/opt/php56/libexec/apache2/libphp5.so
The php.ini file can be found in:
/usr/local/etc/php/5.6/php.ini
✩✩✩✩ Extensions ✩✩✩✩
If you are having issues with custom extension compiling, ensure that
you are using the brew version, by placing /usr/local/bin before /usr/sbin in your PATH:
PATH="/usr/local/bin:$PATH"
PHP56 Extensions will always be compiled against this PHP. Please install them
using --without-homebrew-php to enable compiling against system PHP.
✩✩✩✩ PHP CLI ✩✩✩✩
If you wish to swap the PHP you use on the command line, you should add the following to ~/.bashrc,
~/.zshrc, ~/.profile or your shell's equivalent configuration file:
export PATH="$(brew --prefix homebrew/php/php56)/bin:$PATH"
✩✩✩✩ FPM ✩✩✩✩
To launch php-fpm on startup:
mkdir -p ~/Library/LaunchAgents
cp /usr/local/opt/php56/homebrew.mxcl.php56.plist ~/Library/LaunchAgents/
launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.php56.plist
The control script is located at /usr/local/opt/php56/sbin/php56-fpm
OS X 10.8 and newer come with php-fpm pre-installed, to ensure you are using the brew version you need to make sure /usr/local/sbin is before /usr/sbin in your PATH:
PATH="/usr/local/sbin:$PATH"
You may also need to edit the plist to use the correct "UserName".
Please note that the plist was called 'homebrew-php.josegonzalez.php56.plist' in old versions
of this formula.
With the release of macOS Sierra the Apache module is now not built by default. If you want to build it on your system
you have to install php with the --with-apache option. See  brew options php56  for more details.
To have launchd start homebrew/php/php56 now and restart at login:
brew services start homebrew/php/php56
==> Summary
/usr/local/Cellar/php56/5.6.27_4: 332 files, 48.7M, built in 7 minutes 27 seconds`

這段話什麼意思我就不解釋了,初中英語水平就能看懂,一定要把這裡邊要求配置的配置好。


再來說一下其他兩種方案,自己編譯太費勁我就沒試,理論上是可以的,我在 linux 下這麼搞過,

再就是那個一句話指令碼,因為檔案存在了亞馬遜雲,,,我果斷放棄了,,後來我試了一下,,,,半個小時都沒下載完,,,(沒翻牆),也因為平時習慣用 brew,所以用了 brew的方式,

brew 可以很方便的配置多個版本的 php,配置方法可以看我的博文: