【系統環境】php
操做系統:OS X 10.11.5html
Xcode:7.3.1mysql
【注意】sql
編譯以前,須要安裝 xcode、Homebrew 套件!segmentfault
Mac Pro 安裝 Homebrew 軟件包管理工具api
一、準備相關軟件包,統一放到 /usr/local/src/php 目錄下:xcode
http://cn2.php.net/distributions/php-5.6.21.tar.gzbash
http://ncu.dl.sourceforge.net/project/mhash/mhash/0.9.9.9/mhash-0.9.9.9.tar.gzcurl
ftp://mcrypt.hellug.gr/pub/crypto/mcrypt/libmcrypt/libmcrypt-2.5.7.tar.gzsocket
http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
https://sourceforge.net/projects/libpng/files/libpng16/1.6.21/libpng-1.6.21.tar.xz/download
http://www.ijg.org/files/jpegsrc.v9a.tar.gz
http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz
http://download.savannah.gnu.org/releases/freetype/freetype-2.4.12.tar.gz
http://ftp.gnu.org/gnu/gettext/gettext-0.19.tar.gz
二、安裝依賴庫
# 安裝 libmcrypt cd /usr/local/src/php tar -xzvf ./libmcrypt-2.5.7.tar.gz cd ./libmcrypt-2.5.7 ./configure sudo make sudo make install # 安裝 libmhash cd /usr/local/src/php tar -xzvf ./mhash-0.9.9.9.tar.gz cd ./mhash-0.9.9.9 ./configure sudo make sudo make install # 安裝 libiconv cd /usr/local/src/php tar -xzvf ./libiconv-1.14.tar.gz cd ./libiconv-1.14 ./configure sudo make sudo make install # 安裝 bzip2 cd /usr/local/src/php tar -xzvf ./bzip2-1.0.6.tar.gz cd ./bzip2-1.0.6 sudo make sudo make install # 安裝 libpng (png圖片處理, GD庫依賴) cd /usr/local/src/php tar -xzvf ./libpng-1.6.21.tar.xz cd ./libpng-1.6.21 ./configure sudo make sudo make install # 安裝 ibjpeg (jpg圖片處理, GD庫依賴) cd /usr/local/src/php tar -xzvf ./jpegsrc.v9a.tar.gz cd ./jpeg-9a ./configure sudo make sudo make install # 安裝 freetype cd /usr/local/src/php tar -xzvf ./freetype-2.4.12.tar.gz cd ./freetype-2.4.12 ./configure sudo make sudo make install # 安裝 gettext cd /usr/local/src/php tar -xzvf ./gettext-0.19.tar.gz cd ./gettext-0.19 ./configure sudo make sudo make install
三、安裝PHP
# 解壓PHP安裝包 cd /usr/local/src/php tar -xzvf ./php-5.6.21.tar.gz cd ./php-5.6.21
# 編譯 ./configure \ --prefix=/usr/local/php \ --with-config-file-path=/usr/local/php/etc \ --with-openssl \ --with-zlib \ --with-bz2 \ --with-gd \ --with-jpeg-dir \ --with-png-dir \ --with-gettext \ --with-mhash \ --with-freetype-dir \ --with-mcrypt \ --with-iconv \ --with-curl \ --with-xmlrpc \ --with-mysql \ --with-pdo-mysql \ --with-mysqli \ --enable-calendar \ --enable-pdo \ --enable-zip \ --enable-mbstring \ --enable-mbregex \ --enable-bcmath \ --enable-soap \ --enable-sockets \ --enable-ftp \ --enable-gd-native-ttf \ --enable-shmop \ --enable-sysvmsg \ --enable-sysvsem \ --enable-sysvshm \ --enable-xml \ --enable-pcntl \ --enable-fpm \ --enable-opcache \ --without-pear
【報錯1】
configure: error: Cannot find OpenSSL's <evp.h>
【解決】
(1)、安裝 openssl
brew install openssl
(2)、把 --with-openssl 改成 --with-openssl=/usr/local/opt/openssl
(若是安裝了 brew,那麼openssl的路徑爲 /usr/local/opt/openssl/)
./configure \ --prefix=/usr/local/php \ --with-config-file-path=/usr/local/php/etc \ --with-openssl=/usr/local/opt/openssl \ --with-zlib \ --with-bz2 \ --with-gd \ --with-jpeg-dir \ --with-png-dir \ --with-gettext \ --with-mhash \ --with-freetype-dir \ --with-mcrypt \ --with-iconv \ --with-curl \ --with-xmlrpc \ --with-mysql \ --with-pdo-mysql \ --with-mysqli \ --enable-calendar \ --enable-pdo \ --enable-zip \ --enable-mbstring \ --enable-mbregex \ --enable-bcmath \ --enable-soap \ --enable-sockets \ --enable-ftp \ --enable-gd-native-ttf \ --enable-shmop \ --enable-sysvmsg \ --enable-sysvsem \ --enable-sysvshm \ --enable-xml \ --enable-pcntl \ --enable-fpm \ --enable-opcache \ --without-pear
# 執行 make sudo make
【報錯2】
Undefined symbols for architecture x86_64:
"_PKCS5_PBKDF2_HMAC", referenced from:
_zif_openssl_pbkdf2 in openssl.o
"_TLSv1_1_client_method", referenced from:
_php_openssl_setup_crypto in xp_ssl.o
"_TLSv1_1_server_method", referenced from:
_php_openssl_setup_crypto in xp_ssl.o
"_TLSv1_2_client_method", referenced from:
_php_openssl_setup_crypto in xp_ssl.o
"_TLSv1_2_server_method", referenced from:
_php_openssl_setup_crypto in xp_ssl.o
...
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [sapi/cli/php] Error 1
【解決】
修改 Makefile 文件
找到 EXTRA_LIBS 節點,刪除全部的 -lssl 和 -lcrypto 而後追加 libssl.dylib 和 libcrypto.dylib 的路徑(若是你安裝了 brew,那麼則是 /usr/local/opt/openssl/lib/),從新運行 make 命令。
附上我修改後的 MakeFile EXTRA_LIBS 那一行:
EXTRA_LIBS = -lz -lresolv -lintl -lpng -lz -ljpeg -lcurl -lbz2 -lz -lm -lxml2 -lz -licucore -lm -lcurl -lxml2 -lz -licucore -lm -lfreetype -lz -lbz2 -lxml2 -lz -licucore -lm -lxml2 -lz -licucore -lm -lxml2 -lz -licucore -lm -lxml2 -lz -licucore -lm -lxml2 -lz -licucore -lm -lxml2 -lz -licucore -lm /usr/local/opt/openssl/lib/libcrypto.dylib /usr/local/opt/openssl/lib/libssl.dylib
# 從新編譯 sudo make clean sudo make
【報錯3】
Undefined symbols for architecture x86_64:
"_libiconv_open", referenced from:
_do_convert in gdkanji.o
_convert in encodings.o
"_libiconv", referenced from:
_do_convert in gdkanji.o
_convert in encodings.o
"_libiconv_close", referenced from:
_do_convert in gdkanji.o
_convert in encodings.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [libs/libphp5.bundle] Error 1
【分析】
Makefile中有兩個 -liconv,因而想到,會不會在系統中存在兩份不一樣的 libiconv 呢,果真,系統自己 和 brew(或本身編譯)各有一份iconv:
$ nm /usr/lib/libiconv.dylib | grep iconv
00000000000f1af0 S ___iconv_2VersionNumber
00000000000f1b90 S ___iconv_2VersionString
00000000000f60f0 D __libiconv_version
000000000000a1e1 T _iconv
000000000000a5a0 T _iconv_canonicalize
0000000000013164 T _iconv_close 0000000000013171 T _iconv_open
000000000000a72c T _iconvctl
000000000000a20f T _iconvlist
0000000000014dbd T _libiconv_relocate
0000000000014cff T _libiconv_set_relocation_prefix$ nm /usr/local/lib/libiconv.dylib | grep iconv
00000000000f90c0 D __libiconv_version
0000000000002f10 T _iconv_canonicalize
0000000000002650 T _libiconv
0000000000002680 T _libiconv_close
00000000000011d0 T _libiconv_open
0000000000002690 T _libiconv_open_into
0000000000017970 t _libiconv_relocate
00000000000fa7a8 b _libiconv_relocate.initialized.b
00000000000178b0 T _libiconv_set_relocation_prefix
0000000000002bc0 T _libiconvctl
0000000000002d00 T _libiconvlist
因此就致使了–with-iconv-dir 不管配置成哪個都連接不成功。
【解決】
最終的解決方案是直接修改Makefile,把裏面的 兩個-liconv分別替換成 /usr/lib/libiconv.dylib, /usr/local/lib/libiconv.dylib。使用絕對路徑以後,這個連接就沒有問題了。
EXTRA_LIBS = -lz -lresolv -lintl -lpng -lz -ljpeg -lcurl -lbz2 -lz -lm -lxml2 -lz -licucore -lm -lcurl -lxml2 -lz -licucore -lm -lfreetype -lz -lbz2 -lxml2 -lz -licucore -lm -lxml2 -lz -licucore -lm -lxml2 -lz -licucore -lm -lxml2 -lz -licucore -lm -lxml2 -lz -licucore -lm -lxml2 -lz -licucore -lm /usr/local/opt/openssl/lib/libcrypto.dylib /usr/local/opt/openssl/lib/libssl.dylib /usr/lib/libiconv.dylib /usr/local/lib/libiconv.dylib
# 從新編譯 sudo make clean sudo make
【報錯4】
"_mcrypt_enc_get_algorithms_name", referenced from:
_zif_mcrypt_get_cipher_name in mcrypt.o
......
【解決】
(1)、安裝 mcrypt
brew install libmcrypt
(2)、修改 Makefile 文件,追加 libmcrypt 庫的完整路徑 /usr/local/lib/libmcrypt.dylib
EXTRA_LIBS = -lz -lresolv -lintl -lpng -lz -ljpeg -lcurl -lbz2 -lz -lm -lxml2 -lz -licucore -lm -lcurl -lxml2 -lz -licucore -lm -lfreetype -lz -lbz2 -lxml2 -lz -licucore -lm -lxml2 -lz -licucore -lm -lxml2 -lz -licucore -lm -lxml2 -lz -licucore -lm -lxml2 -lz -licucore -lm -lxml2 -lz -licucore -lm /usr/local/lib/libmcrypt.dylib /usr/local/opt/openssl/lib/libcrypto.dylib /usr/local/opt/openssl/lib/libssl.dylib /usr/lib/libiconv.dylib /usr/local/lib/libiconv.dylib
終於沒報錯,繼續安裝,須要 sudo 一下得到權限
# 從新編譯 sudo make clean sudo make sudo make install
四、經過如下指令 啓動 和 中止 php-fpm
# 啓動 php-fpm php-fpm -D # 關閉 php-fpm killall php-fpm
注意:php-fpm.conf 中的 用戶名 及 用戶組 配置爲當前用戶,即 jianbao、staff
延伸閱讀:
Mac Pro 開機自啓動 PHP-FPM,Nginx,MySql 等軟件
【參考】
http://www.widlabs.com/article/mac-os-x-compile-install-php
http://superuser.com/questions/394219/compiling-php-on-os-x-iconv-works-only-if-forced-to-64-bit
https://segmentfault.com/q/1010000004137098
https://upliu.net/compile-php-with-openssl-on-max-osx-error.html
http://b.liuctic.com/2012/01/build-php-on-lion/
http://www.javashuo.com/article/p-fekfvqci-e.html
全新安裝Mac OSX 開發者環境 同時使用homebrew搭建 PHP,Nginx ,MySQL,Redis,Memcache ... ... (LNMP開發環境)