昨天,我在一臺 CentOS 6.10 上面編譯 PHP 7.4.7 和編譯前幾個版本有很大的區別,PHP 7.4 開始使用了一個叫 pkg-config 的東西,有點先進,但是在老舊的系統上,真是無比痛苦的一個體驗。

今天我嘗試一下在 CentOS 7.8 上面編譯一下,之前沒有幹過,我就記錄一下過程,雖然無聊得很,但是記錄下來,可以給以後節省點時間。

yum install -y systemd-devel.x86_64
yum install -y libxml2-devel.x86_64
yum install -y openssl-devel.x86_64
yum install -y sqlite-devel.x86_64
yum install -y libcurl-devel.x86_64
yum install -y libpng12-devel.x86_64
# 注意,看你的系統裏是 libpng 後面的數字是幾
ln -s /lib64/pkgconfig/libpng12.pc /lib64/pkgconfig/libpng.pc
yum install -y libwebp-devel.x86_64
yum install -y libjpeg-turbo-devel.x86_64
yum install -y freetype-devel.x86_64
yum install -y oniguruma-devel.x86_64
yum install -y readline-devel.x86_64
yum install -y libzip-devel.x86_64

# 手動編譯 libzip
yum install -y cmake3
yum install -y bzip2-devel.x86_64
wget https://libzip.org/download/libzip-1.7.1.tar.xz
tar xf libzip-1.7.1.tar.xz
mkdir build
cd build
cmake3 -DENABLE_GNUTLS=OFF ..
make
make test
make install

# 進入 php-7.4.7 目錄
PKG_CONFIG_PATH="/usr/local/lib64/pkgconfig" \
./configure -C \
  --prefix=/usr/local/php7 \
  --enable-fpm \
  --with-fpm-systemd \
  --with-openssl \
  --with-zlib \
  --enable-bcmath \
  --with-curl \
  --enable-exif \
  --enable-gd \
  --with-webp \
  --with-jpeg \
  --with-freetype \
  --with-gettext \
  --enable-mbstring \
  --with-mysqli \
  --with-mysql-sock=/var/lib/mysql/mysql.sock \
  --enable-pcntl \
  --with-pdo-mysql \
  --with-readline \
  --enable-soap \
  --enable-sockets \
  --with-zip \
  --enable-mysqlnd

# 開始編譯,使用 2 核
make -j2
make test
make install

PHP 7.4.7 版本,我編譯下來感覺就是,使用了 pkg-config 這個工具來自動識別 lib 庫所在的位置,這個工具是很強大的,但是遺憾的是,不夠普及,不是每個包都正確帶有了自己的 pkgconfig 文件,以 .pc 結尾的。

編譯中遇到的麻煩,都是這個問題帶來的,比如上面的執行記錄裏,就可以看到,libpng,這個依賴,使用 yum 安裝的包,名字竟然叫 libpng12,我做了一個軟鏈,繞過了這個問題。但是不是每次都這麼順利的。

另一個問題就是 libzip,系統裏只有 0.10 版本的,但是編譯 PHP 7.4+ 需要 0.11 版本,yum 就解決不了這個問題了,只能使用一些私有的源。當然,如果使用私有源,就可以直接安裝現成的 PHP 7.4+ 了,沒必要編譯這麼痛苦了,我覺得如果沒有什麼必要性,還是用網上的私有源安裝比較好,還會帶有全套的運維腳本,比自己編譯方便太多了。

相關文章