(MAC) PHP安裝和配置

so_easy發表於2020-09-09

下載資源包

安裝參考文件:編譯 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.33.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 協議》,轉載必須註明作者和本文連結

相關文章