下載資源包
安裝參考文件:編譯 PHP
git clone http://git.php.net/repository/php-src.git
cd php-src
git checkout PHP-7.3
# 或者下載其他的版本資源:git checkout PHP-7.0
但是在checkout的時候需要注意的是bison的版本,具體bison版本對應PHP版本如下:
bison,用於生成 PHP 解析器。
2.4 或更高版本(對於 PHP 7.0-7.3)
3.0 或更高版本(對於 PHP 7.4)
如果提示當前bison版本不匹配,可以嘗試配置.bash_profile
PATH=/usr/local/opt/bison/bin/:$PATH
編譯安裝
執行步驟:
# 如果./configure 不存在,則先執行 `./buildconf`。
# 重新生成 ./configure 執行 `rm -f ./configure && ./buildconf --force`
# ./configure的時候出錯記錄:
# unrecognized options: --enable-safe-mode, --enable-gd-native-ttf,--with-mcrypt=shared
# configure: error: Couldn't find pcre2-config [--with-pcre-regex=shared]
rm -f ./configure && ./buildconf --force
# 簡易配置
./configure -q --prefix=/usr/local/php7.3
sudo make ZEND_EXTRA_LIBS='/usr/local/opt/libiconv-1.16/lib/libiconv.dylib'
sudo make install
# 指定配置項配置, 按以下配置和指定ZEND_EXTRA_LIBS make成功
./configure -q --prefix=/usr/local/php7.3 \
--enable-fpm \
--enable-cli \
--enable-ftp \
--enable-zip \
--enable-calendar \
--enable-dba \
--enable-gd-jis-conv \
--enable-mbstring \
--enable-pcntl \
--enable-shmop \
--enable-sysvsem \
--enable-sysvshm \
--enable-sysvmsg \
--enable-sockets \
--enable-exif \
--enable-soap \
--enable-wddx \
--enable-mysqlnd \
--enable-zend-signals \
--enable-json \
--enable-dom \
--enable-dba \
--enable-xmlreader --enable-xmlwriter --enable-xml \
--enable-inline-optimization \
--enable-hash \
--enable-phar \
--enable-filter \
--enable-pdo \
--with-pdo-mysql=shared,mysqlnd \
--with-pdo-sqlite=shared \
--with-mhash=shared \
--with-libxml-dir=shared \
--with-zlib-dir=/usr/local/opt/zlib \
--with-bz2=/usr/local/opt/bzip2/ \
--with-curl=/usr/local/opt/curl \
--with-pcre-jit \
--with-openssl-dir=/usr/local/opt/openssl@1.1 \
--with-gd=shared \
--with-jpeg-dir=/usr/local/opt/jpeg \
--with-png-dir=/usr/local/opt/libpng \
--with-freetype-dir=/usr/local/opt/freetype \
--with-pic \
--with-icu-dir=/usr/local/opt/icu4c \
--with-xsl=shared \
--with-gettext=shared \
--with-mysqli=shared \
# --enable-maintainer-zts \
# --enable-debug \
# --enable-maintainer-zts 和 --enable-debug 會決定最終生成的擴充套件目錄名稱。
# 比如:/usr/local/php7.3/lib/php/extensions/debug-non-zts-20180731/
# --with-tidy=shared \
# --enable-intl \
# sudo make -jN #N是系統核心數,mac透過`sysctl machdep.cpu | grep thread`,我的是4 。
# 前面iconv的問題在make的時候手動指定,或者修改Makefile也行。
sudo make ZEND_EXTRA_LIBS='/usr/local/opt/libiconv-1.16/lib/libiconv.dylib' -j4
sudo make install
但是有些時候這麼安裝可能並不符合你的需求,我們需要定製化一些引數。
首先需要檢視./configure 命令可接受的引數:./configure -h
,然後分析這些引數。
問題及解決
iconv問題
這次編譯安裝給我帶來最大困擾的就是iconv的問題。在啟用配置--enable-cli
||--enable--fpm
時都會去找iconv庫。如果找不到的話就會報錯。
首先碰見這個問題的思路是採取解決make: *** [sapi/cli/php] Error 1
這個問題的方案,但是實踐證明這裡還會存在一些MAC自帶的坑,以及一些我還無法描述的坑。如果執行make失敗,可能的原因如下:
(1)–with-iconv=DIR,DIR指定了MAC透過brew安裝的libiconv路徑
brew install libiconv # brew reinstall libiconv
./configure -q --prefix=/usr/local/php7.3 --with-iconv=/usr/local/opt/libiconv
make # 報錯
(2)–with-iconv-dir=DIR,DIR指定了MAC透過brew安裝的libiconv路徑,還是報錯
(3)透過修改Makefile
指定MAC預設的/usr/local/opt/libiconv/lib/libiconv.dylib
,還是報錯
(4)透過make ZEND_EXTRA_LIBS='/usr/local/opt/libiconv/lib/libiconv.dylib'
,還是報錯
到(3)、(4)這裡我已經懷疑不是我的解決方法有問題,而是MAC透過
brew
安裝的libiconv
有問題。關於第(1)、(2)的問題我抱有很大的疑惑,因為在指定OpenSSL的DIR時也是類似的--with-openssl-dir=/usr/local/opt/openssl@1.1
但是似乎沒有出現OpenSSL的問題。可能是我目前還沒碰到罷了,原因不明!
竟然可能是libiconv
的問題,那麼解決思路就是重新編譯安裝一個libiconv
。
(5) 正確執行過程如:
# 編譯安裝libiconv最新版本
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.16.tar.gz
tar -zxvf libiconv-1.16.tar.gz && cd libiconv-1.16
./configure --prefix=/usr/local/opt/libiconv-1.16 && make && make install
# 編譯安裝PHP
./configure -q --prefix=/usr/local/php7.3
sudo make ZEND_EXTRA_LIBS='/usr/local/opt/libiconv-1.16/lib/libiconv.dylib' -j4
make test && sudo make install
1、如下報錯,原因是
--with-iconv-dir
找不到iconv的類庫,改成--with-iconv
依然報錯!
./configure -q –prefix=/usr/local/php7.3 –with-iconv-dir=/usr/local/opt/libiconv-1.16
2、如果安按照(5)執行依然失敗,試試nm /usr/local/opt/libiconv-1.16/lib/libiconv.dylib
參考
make: *** [sapi/cli/php] Error 1
這裡是找不到iconv
擴充套件(此方法也可以解決其他找不到路徑的問題)。
(1)第一種辦法是在Makefile
檔案中的EXTRA_LIBS
這行找到-liconv
然後替換成libiconv
的絕對路徑/usr/local/opt/libiconv/lib/libiconv.dylib
(2)在執行 make
時指定iconv
的擴充套件:
./configure -q --prefix=/usr/local/php7.3
sudo make ZEND_EXTRA_LIBS='/usr/local/opt/libiconv/lib/libiconv.dylib'
make: *** [sapi/cgi/php-cgi] Error 1
執行./configure
是指定引數--disable-cgi
configure: error: Please reinstall the BZip2 distribution
brew reinstall bzip2
修改配置--with-bz2=/usr/local/opt/bzip2/
cURL version 7.15.5 or later is required to compile php with cURL support
brew reinstall curl
brew info curl
這個問題和bzip2
的問題類似,最終也是透過配置--with-curl=/usr/local/opt/curl
不再報錯!
configure: error: Cannot find OpenSSL’s <evp.h>
修改配置--with-openssl-dir=/usr/local/opt/openssl@1.1
,不再報錯!
configure: error: Unable to detect ICU…
brew search icu
brew reinstall icu4c
configure: error:
Due to the way that loadable modules work on OSX/Darwin, you need to
compile the PDO package statically into the PHP core.
暫且移除該配置--enable-pdo=shared
--enable-pdo=shared
configure: error: Cannot find libtidy
MAC上看到的幾個似乎不是tidy庫
make: *** [sapi/fpm/php-fpm] Error 1
導致錯誤的原因似乎還是iconv。
make: *** [ext/intl/intl_convertcpp.lo] Error 1
_executor_globals_id
在我本地有兩個PHP資源包,一個是7.1,一個是7.3 。7.1的是不知道什麼時候下載的,7.3的是透過以上git下載的。然後在原來7.1下和7.3下如上編譯安裝都成功了。但是在7.1下啟動--enable-maintainer-zts
增加擴充套件mysqli.so
時報錯。於是移除zts擴充套件,再重新編譯安裝,又報另外一種錯誤:Symbol not found: _mysqlnd_global_stats
。但是在7.3下是沒有報任何錯誤。可能原因就是資源包的問題了。
本作品採用《CC 協議》,轉載必須註明作者和本文連結