前段時間,想嘗試下 PHP 的多線程擴展 pthreads,由於其要求 PHP 啟用 ZTS (Zend Thread Safety),
但是筆者所使用的發行版所能安裝的 PHP 包都是 non-zts 的,所以只能自行編譯和安裝 PHP 了。
題外話,貌似基本大多數 Linux 發行版的 PHP 包都是 non-zts 的,比如 Ubuntu、CentOS、Arch Linux 等。
不過據我所知,Arch Linux AUR 有 ZTS 版本的 PHP,傳送門可在本文底部相關鏈接找到。
另外 Gentoo 的話,PHP 默認是 ZTS 的。
話不多說,讓我們開始正題。
下載
首先需要下載 PHP 的源碼包 - 下載地址。
本文以最新的 PHP 版本 - 7.2 為例,題外話:
pthreads(v3)
只能在 PHP 7.2 使用。
1$ wget -O php-7.2.12.tar.gz http://cn2.php.net/get/php-7.2.12.tar.gz/from/this/mirror
2$ tar xvf php-7.2.12.tar.gz
3$ cd php-7.2.12
wget -O
指定寫入(下載)的文件名稱
這裡我們下載和解壓 PHP 的源碼,並進入解壓後的 PHP 目錄,下一步編譯時,需要在此目錄進行操作。
編譯
接下來就是編譯
編譯參數
我們可以通過以下命令,查看目標版本支持的所有編譯參數:
1$ ./configure --help
這裡就不詳盡介紹所有的參數了,本文只對一些重要的信息進行說明:
--prefix
:最終安裝的 PHP 目錄,比如/usr/local
,由於筆者一般會使用多個 PHP 版本,目錄一般會帶上主次版本號,比如本文所使用到的:/usr/local/php72
--enable-maintainer-zts
:啟用 ZTS - 線程安全,必要參數--enable-fpm
:啟用 PHP-FPM--with-gd
:啟用 GD 庫--enable-pcntl
:PHP 多進程擴展,適用於 *nix 系統--with-pdo-mysql
:MySQL PDO 驅動
本文以以下配置進行 PHP 編譯,請根據需要自行增刪:
1$ ./configure \
2 --prefix=/usr/local/php72 \
3 --enable-maintainer-zts \
4 --enable-fpm \
5 --with-gd --with-freetype \
6 --enable-pcntl \
7 --with-pdo-mysql --with-mysqli \
8 --with-mcrypt \
9 --enable-soap \
10 --enable-sockets \
11 --enable-pcntl \
12 --enable-intl
配置期間,會檢測系統的依賴,由於筆者 Linux 發行版已安裝了自帶的 PHP,所有依賴基本都自行解決了,所以無需額外安裝其他依賴。
由於依賴因配置、系統的不同(不同發行版有著其自己的包管理方式,比如 apt、yum、emerge、pacman etc…)而解決方法不同,所以如果遇到編譯錯誤或者缺少依賴,請自行 Google 解決。
安裝
緊接著,安裝:
1$ make && make install
在 make install
之前,你也可以進行測試 make test
(可選)。
make install
可能需要 root 權限,鑑於要寫入到之前編譯配置的 --prefix
目錄。
如果修改了編譯配置,你可能需要
make clean
,然後再安裝。
驗證安裝
1$ /usr/local/php72/bin/php -v
2
3PHP 7.2.12 (cli) (built: Nov 29 2018 14:57:26) ( ZTS )
4Copyright (c) 1997-2018 The PHP Group
5Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
其中會有 ZTS
字眼,說明我們安裝的是線程安全版。
配置文件
安裝完成後,先複製一下配置文件,這裡筆者將配置文件分開兩個,一個專用於 CLI
模式。因為 CLI
和其他模式可能會有一絲差異,比如 pthreads
僅限於 CLI
模式使用。
1$ cp ./php.ini-development /usr/local/php72/lib/php.ini
2$ cp ./php.ini-development /usr/local/php72/lib/php-cli.ini
如果打算配置的是生產環境,將
php.ini-development
替換為php.ini-production
即可。
測試命令行模式是否加載到正確的配置文件:
1$ /usr/local/php72/bin/php --ini
2
3Configuration File (php.ini) Path: /usr/local/php72/lib
4Loaded Configuration File: /usr/local/php72/lib/php-cli.ini
5Scan for additional .ini files in: (none)
6Additional .ini files parsed: (none)
軟連接
自此,我們已經完成 PHP 編譯安裝,最後為新安裝的 PHP 腳本建立軟連接,這樣就不需要每次那麼繁瑣地輸入腳本的完整路徑了:
1$ ln -s /usr/local/php72/bin/php /usr/local/bin/php72
接著驗證是否有效:
1$ php72 -v