PHPBrew 使用指南

歡迎轉(zhuǎn)載,但請(qǐng)?jiān)陂_頭或結(jié)尾注明原文出處【blog.chaosjohn.com】

前言

咋一看,這個(gè)名字取得,肯定是跟 Homebrew 學(xué)的。既然 Homebrew 的定位是 macOS 上的 包管理器,那 PHPBrew 肯定也跟 包管理器 沾點(diǎn)邊。沒錯(cuò),它可以用來 構(gòu)建安裝 多個(gè)版本的 php 到用戶主目錄($HOME)下。

項(xiàng)目主頁

抄一下 PHPBrew 的特性:

  • 編譯配置選項(xiàng)簡化為variant,不用再過于擔(dān)心搜尋路徑
  • 通過不同的variant(比如PDO, mysql, sqlite, debug等等)進(jìn)行構(gòu)建php
  • 編譯 apachenginx 模塊,并且按不同版本區(qū)分
  • 構(gòu)建和安裝到用戶主目錄下,免去root權(quán)限
  • 版本間易于切換,且與bash/zsh集成
  • 自動(dòng)特性檢測
  • 易于安裝和啟用 php擴(kuò)展 到當(dāng)前環(huán)境
  • 支持安裝多個(gè)版本的 php 到系統(tǒng)環(huán)境中
  • HomebrewMacPorts 優(yōu)化路徑檢測

環(huán)境需求

  • 平臺(tái)支持
    • Mac OS 10.5+
    • Ubuntu
    • Debian
    • RHEL / CentOS
  • 依賴需求
    • PHP5.3+
    • bz2
    • curl
    • gcc, binutils, autoconf, libxml, zlib, readline

各平臺(tái)上的依賴安裝請(qǐng)參考官方文檔,這里筆者僅附上 Mac OS + HomebrewUbuntu 20.04的安裝命令

  • Mac OS
$ xcode-select --install
$ brew install autoconf pkg-config
  • Ubuntu 20.04
$ sudo apt update
$ sudo apt install build-essential libbz2-dev libreadline-dev libsqlite3-dev libssl-dev libxml2-dev php7.4-cli php7.4-bz2 pkg-config

安裝

下載

$ curl -L -O https://github.com/phpbrew/phpbrew/releases/latest/download/phpbrew.phar
$ chmod +x phpbrew.phar

安裝到配置在 $PATH 環(huán)境變量里的bin目錄,比如官方文檔里的 /usr/local/bin(筆者用的是 $HOME/bin

sudo mv phpbrew.phar /usr/local/bin/phpbrew

設(shè)置

初始化shell環(huán)境

$ phpbrew init

init 指令將會(huì)創(chuàng)建 $HOME/.phpbrew 目錄

將下面一行加入 .bashrc 或者 .zshrc

[[ -e ~/.phpbrew/bashrc ]] && source ~/.phpbrew/bashrc

設(shè)置搜尋路徑前綴

設(shè)置默認(rèn)的搜尋路徑前綴,用于搜尋依賴庫,可選項(xiàng)有 macports, homebrew, debian, ubuntu 或者 自定義路徑

  • Homebrew用戶
$ phpbrew lookup-prefix homebrew
  • MacPorts用戶
$ phpbrew lookup-prefix macports

基本用法

列舉已知的版本

$ phpbrew known
===> Fetching release list...
Downloading https://www.php.net/releases/index.php?json=1&version=8&max=100 via php stream
Downloading https://www.php.net/releases/index.php?json=1&version=7&max=100 via php stream
8.0: 8.0.0 ...
7.4: 7.4.13, 7.4.12, 7.4.11, 7.4.10, 7.4.9, 7.4.8, 7.4.7, 7.4.6 ...
7.3: 7.3.25, 7.3.24, 7.3.23, 7.3.22, 7.3.21, 7.3.20, 7.3.19, 7.3.18 ...
7.2: 7.2.34, 7.2.33, 7.2.32, 7.2.31, 7.2.30, 7.2.29, 7.2.28, 7.2.27 ...
7.1: 7.1.33, 7.1.32, 7.1.31, 7.1.30, 7.1.29, 7.1.28, 7.1.27, 7.1.26 ...
7.0: 7.0.33, 7.0.32, 7.0.31, 7.0.30, 7.0.29, 7.0.28, 7.0.27 ...

想看到更多小版本

$ phpbrew known --more
Read local release list (last update: 2020-12-01 03:46:52 UTC).
You can run `phpbrew update` or `phpbrew known --update` to get a newer release list.
8.0: 8.0.0
7.4: 7.4.13, 7.4.12, 7.4.11, 7.4.10, 7.4.9, 7.4.8, 7.4.7, 7.4.6, 7.4.5, 7.4.4, 7.4.3,
     7.4.2, 7.4.1, 7.4.0
7.3: 7.3.25, 7.3.24, 7.3.23, 7.3.22, 7.3.21, 7.3.20, 7.3.19, 7.3.18, 7.3.17, 7.3.16,
     7.3.15, 7.3.14, 7.3.13, 7.3.12, 7.3.11, 7.3.10, 7.3.9, 7.3.8, 7.3.7, 7.3.6,
     7.3.5, 7.3.4, 7.3.3, 7.3.2, 7.3.1, 7.3.0
7.2: 7.2.34, 7.2.33, 7.2.32, 7.2.31, 7.2.30, 7.2.29, 7.2.28, 7.2.27, 7.2.26, 7.2.25,
     7.2.24, 7.2.23, 7.2.22, 7.2.21, 7.2.20, 7.2.19, 7.2.18, 7.2.17, 7.2.16, 7.2.15,
     7.2.14, 7.2.13, 7.2.12, 7.2.11, 7.2.10, 7.2.9, 7.2.8, 7.2.7, 7.2.6, 7.2.5,
     7.2.4, 7.2.3, 7.2.2
7.1: 7.1.33, 7.1.32, 7.1.31, 7.1.30, 7.1.29, 7.1.28, 7.1.27, 7.1.26, 7.1.25, 7.1.24,
     7.1.23, 7.1.22, 7.1.21, 7.1.20, 7.1.19, 7.1.18, 7.1.17, 7.1.16, 7.1.15, 7.1.14
7.0: 7.0.33, 7.0.32, 7.0.31, 7.0.30, 7.0.29, 7.0.28, 7.0.27

更新最新版本發(fā)行列表

$ phpbrew update
===> Fetching release list...
Downloading https://www.php.net/releases/index.php?json=1&version=8&max=100 via php stream
Downloading https://www.php.net/releases/index.php?json=1&version=7&max=100 via php stream
8.0: 1 releases
7.4: 14 releases
7.3: 26 releases
7.2: 33 releases
7.1: 20 releases
7.0: 7 releases
===> Done

獲取小于7.0的老版本(官方文檔已滯后,還僅僅只把 小于5.4 作為老版本)

注意:不保證能成功構(gòu)建這些不被PHPBrew官方支持的版本

$ phpbrew update --old

列舉小于7.0的老版本

$ phpbrew known --old
===> Fetching release list...
Downloading https://www.php.net/releases/index.php?json=1&version=8&max=100 via curl extension
Downloading https://www.php.net/releases/index.php?json=1&version=7&max=100 via curl extension
Downloading https://www.php.net/releases/index.php?json=1&version=5&max=1000 via curl extension
8.0: 8.0.0 ...
7.4: 7.4.13, 7.4.12, 7.4.11, 7.4.10, 7.4.9, 7.4.8, 7.4.7, 7.4.6 ...
7.3: 7.3.25, 7.3.24, 7.3.23, 7.3.22, 7.3.21, 7.3.20, 7.3.19, 7.3.18 ...
7.2: 7.2.34, 7.2.33, 7.2.32, 7.2.31, 7.2.30, 7.2.29, 7.2.28, 7.2.27 ...
7.1: 7.1.33, 7.1.32, 7.1.31, 7.1.30, 7.1.29, 7.1.28, 7.1.27, 7.1.26 ...
7.0: 7.0.33, 7.0.32, 7.0.31, 7.0.30, 7.0.29, 7.0.28, 7.0.27 ...
5.6: 5.6.40, 5.6.39, 5.6.38, 5.6.37, 5.6.36, 5.6.35, 5.6.34, 5.6.33 ...
5.5: 5.5.38, 5.5.37, 5.5.36, 5.5.35, 5.5.34, 5.5.33, 5.5.32, 5.5.31 ...
5.4: 5.4.45, 5.4.44, 5.4.43, 5.4.42, 5.4.41, 5.4.40, 5.4.39, 5.4.38 ...
5.3: 5.3.29, 5.3.28, 5.3.27, 5.3.26, 5.3.25, 5.3.24, 5.3.23, 5.3.22 ...
5.2: 5.2.17, 5.2.16, 5.2.15, 5.2.14, 5.2.13, 5.2.12, 5.2.11, 5.2.10 ...
5.1: 5.1.6, 5.1.5, 5.1.4, 5.1.3, 5.1.2, 5.1.1, 5.1.0 ...
5.0: 5.0.5, 5.0.4, 5.0.3, 5.0.2, 5.0.1, 5.0.0 ...
PHPBrew needs PHP 5.3 or above to run. build/switch to versions below 5.3 at your own risk.

開始構(gòu)建你自己的PHP

用默認(rèn)variant簡單構(gòu)建并安裝PHP:

$ phpbrew install 7.4.13 +default

這里我們推薦使用 default 設(shè)置,它涵蓋了大部分廣泛使用的variant;如果你需要一個(gè) 最小化 安裝,那就移除 default,替換成別的variant(經(jīng)筆者摸索,最小化+opcache -xml)。

通過傳遞參數(shù) -j 或者 --jobs 進(jìn)行并行編譯:

$ phpbrew install -j $(nproc) 7.4.13 +default

包含測試:

$ phpbrew install --test 7.4.13 +default

包含調(diào)試信息:

$ phpbrew -d install --test 7.4.13 +default

安裝小于5.3的老版本(筆者實(shí)測5.0版本的鏈接均已不可訪問)

$ phpbrew install --old 5.2.17

安裝 next 不穩(wěn)定版:

$ phpbrew install next

從GitHub倉庫的某tag安裝

$ phpbrew install github:php/php-src@PHP-7.0

as 給構(gòu)建安裝的PHP取別名,以筆者在前面描述的 最小化 安裝舉例

$ phpbrew install 7.4.13 +opcache -xml as 7.4.13-minimal

清理構(gòu)建目錄

$ phpbrew clean 7.4.13-minimal
===> Running make clean: /usr/bin/make -C '/Users/chaos/.phpbrew/build/7.4.13-minimal' --quiet 'clean'
Distribution is cleaned up. Woof!

Variants

PHPBrew 幫你安排構(gòu)建參數(shù),你可以簡單地指定variant,PHPBrew會(huì)自動(dòng)檢測 include 路徑并且構(gòu)建編譯選項(xiàng)。

PHPBrew 提供了默認(rèn)的和虛擬的variant。默認(rèn)的包含了大部分廣泛使用的variants;虛擬的則定義了一組variant,即使用一個(gè)虛擬variant可以同時(shí)選用多個(gè)variant。

查看PHPBrew提供了哪些variant:

$ phpbrew variants
Variants:
  all, apxs2, bcmath, bz2, calendar, cgi, cli, ctype, curl, dba, debug, dom,
  dtrace, editline, embed, exif, fileinfo, filter, fpm, ftp, gcov, gd,
  gettext, gmp, hash, iconv, imap, inifile, inline, intl, ipc, ipv6, json,
  kerberos, ldap, libgcc, mbregex, mbstring, mcrypt, mhash, mysql, opcache,
  openssl, pcntl, pcre, pdo, pear, pgsql, phar, phpdbg, posix, readline,
  session, soap, sockets, sodium, sqlite, static, tidy, tokenizer, wddx,
  xml, xmlrpc, zip, zlib, zts


Virtual variants:
  dbs: sqlite, mysql, pgsql, pdo
  mb: mbstring, mbregex
  neutral:
  small: bz2, cli, dom, filter, ipc, json, mbregex, mbstring, pcre, phar,
  posix, readline, xml, curl, openssl
  default: bcmath, bz2, calendar, cli, ctype, dom, fileinfo, filter, ipc,
  json, mbregex, mbstring, mhash, pcntl, pcre, pdo, pear, phar, posix,
  readline, sockets, tokenizer, xml, curl, openssl, zip
  everything: dba, ipv6, dom, calendar, wddx, static, inifile, inline, cli,
  ftp, filter, gcov, zts, json, hash, exif, mbstring, mbregex, libgcc,
  pdo, posix, embed, sockets, debug, phpdbg, zip, bcmath, fileinfo, ctype,
  cgi, soap, pcntl, phar, session, tokenizer, opcache, imap, ldap, tidy,
  kerberos, xmlrpc, fpm, dtrace, pcre, mhash, mcrypt, zlib, curl, readline,
  editline, gd, intl, sodium, openssl, mysql, sqlite, pgsql, xml, gettext,
  iconv, bz2, ipc, gmp, pear


Using variants to build PHP:

  phpbrew install php-5.3.10 +default
  phpbrew install php-5.3.10 +mysql +pdo
  phpbrew install php-5.3.10 +mysql +pdo +apxs2
  phpbrew install php-5.3.10 +mysql +pdo +apxs2=/usr/bin/apxs2

可以看到虛擬variant有:dbs, mb, neutral, small, default, everything

(表明上來看 neutral 是最精簡的,它不添加任何編譯選項(xiàng),但實(shí)際安裝過程中還是會(huì)啟用 xmlopcache,而這二者中只有后者無任何第三方依賴。所以真正意義上的 最小化+opcache -xml 或者 +neutral -xml

  • 需要啟用一個(gè)variant,直接在variant前加一個(gè) + 號(hào)
  • 需要禁用一個(gè)variant,直接在variant前加一個(gè) - 號(hào)
  • +- 號(hào)可以多個(gè)隨意組合

指定依賴路徑,比如構(gòu)建pgsql擴(kuò)展時(shí)

$ phpbrew install 7.4.13 +pdo +pgsql=/opt/local/lib/postgresql91/bin

/opt/local/lib/postgresql91/bin 路徑下的 pg_config 是構(gòu)建時(shí)需要的

傳遞額外的configure選項(xiàng)

$ phpbrew install 7.4.13 +mysql +sqlite -- \
    --enable-ftp --apxs2=/opt/local/apache2/bin/apxs

使用與切換

使用(臨時(shí)切換版本)

$ phpbrew use 7.4.13
$ phpbrew use 7.4.13-minimal

切換默認(rèn)版本

$ phpbrew switch 7.4.13-minimal

從PHPBrew的版本切換到系統(tǒng)安裝的版本

$ phpbrew off

列舉安裝的所有php版本

$ phpbrew list

擴(kuò)展安裝器

PHPBrew 還能方便的幫助你安裝 PHP擴(kuò)展(無論是PHP源碼內(nèi)自帶的亦或是來自于 PECL 的)

如果是PHP源碼內(nèi)自帶的,PHPBrew會(huì)自動(dòng)切換到源碼目錄進(jìn)而安裝擴(kuò)展;否則會(huì)去 PECL http://pecl.php.net去獲取擴(kuò)展源碼包

PHPBrew同時(shí)會(huì)為安裝上的擴(kuò)展創(chuàng)建配置,省去你手寫啟用擴(kuò)展的配置文件。配置文件夾位于: $HOME/.phpbrew/php/{php-version}/var/db

安裝擴(kuò)展 - 最簡單的方式

在你安裝任何擴(kuò)展之前,你應(yīng)該切換到需要安裝擴(kuò)展的php版本:

$ phpbrew use 7.4.13-minimal

然后運(yùn)行 ext install 來安裝自己需要的擴(kuò)展

$ phpbrew ext install redis
$ phpbrew ext install xdebug
$ phpbrew ext install acpu
$ phpbrew ext install memcache

安裝擴(kuò)展 - 指定穩(wěn)定性版本

  • 指定 穩(wěn)定性標(biāo)簽,可選項(xiàng)有 stable / latest / beta,不指定即默認(rèn)為 stable,例如:$ phpbrew ext install xdebug latest
  • 指定 擴(kuò)展版本號(hào),例如:$ phpbrew ext install xdebug 3.0.0

查看擴(kuò)展的配置選項(xiàng)

要查看構(gòu)建擴(kuò)展是否有額外的配置選項(xiàng),使用 ext show

$ phpbrew ext show redis
                Name: redis
    Source Directory: /Users/chaos/.phpbrew/build/7.4.13/ext/redis
              Config: /Users/chaos/.phpbrew/build/7.4.13/ext/redis/config.m4
            INI File: /Users/chaos/.phpbrew/php/7.4.13/var/db/redis.ini
           Extension: Pecl
                Zend: no
              Loaded: yes

   Configure Options:

        --enable-redis-igbinary[=no]     enable igbinary serializer support?

        --enable-redis-lzf[=no]          enable lzf compression support?

        --enable-redis-zstd[=no]         enable zstd compression support?

為構(gòu)建擴(kuò)展添加額外配置選項(xiàng)

$ phpbrew ext install redis -- --enable-redis-lzf=yes

從Github安裝擴(kuò)展

特殊的前綴 github: 則告訴PHPBrew要去 php-memcached-dev/phpmemcachedphp7 分支拉取代碼進(jìn)行構(gòu)建

$ phpbrew ext install github:php-memcached-dev/php-memcached php7 -- --disable-memcached-sasl

指定下載器進(jìn)行安裝擴(kuò)展

目前,PHPBrew有4個(gè)下載器實(shí)現(xiàn):

  • php_curl 內(nèi)置的 php curl擴(kuò)展,為默認(rèn)下載器
  • php_stream 內(nèi)置的 php steam封裝
  • curl
  • wget

指定 curl 作為下載器:

$ phpbrew ext install --downloader curl redis

如果選用的下載器支持 User-AgentProxy 配置:

$ phpbrew ext install --downloader php_curl --http-proxy=... --http-proxy-auth=... apcu

啟用擴(kuò)展

筆者親測,通過 ext install 安裝的擴(kuò)展,安裝完即為啟用狀態(tài)。

另外也可以通過 PECL 安裝擴(kuò)展并且手動(dòng)啟用:

$ pecl install mongo
$ phpbrew ext enable mongo

ext enable 指令幫你創(chuàng)建配置文件 {current php base}/var/db/{extension name}.ini 用以啟用擴(kuò)展

為當(dāng)前php版本配置 php.ini

$ export EDITOR=vim # 該行為可選項(xiàng),指定你常用的編輯器
$ phpbrew config

更新 PHPBrew

運(yùn)行 self-update 指令將會(huì)從Github的master分支下載最新版本的二進(jìn)制文件替換自身(即本文開頭的存放位置/usr/local/bin/phpbrew

相關(guān)的目錄

已安裝的php位于 $HOME/.phpbrew/php,以 7.4.13-minimal 舉例,為 $HOME/.phpbrew/php/7.4.13-minimal/bin/php

配置文件為 $HOME/.phpbrew/php/7.4.13-minimal/etc/php.ini

擴(kuò)展的配置文件位于 $HOME/.phpbrew/php/7.4.13-minimal/var/db目錄下:

$HOME/.phpbrew/php/7.4.13-minimal/var/db/memcache.ini
$HOME/.phpbrew/php/7.4.13-minimal/var/db/xdebug.ini
$HOME/.phpbrew/php/7.4.13-minimal/var/db/redis.ini

在各目錄之間切換的快捷命令

~官方文檔里這部分涉及的指令,比如 build-dir / dist-dir / etc-dir / var-dir 已親測全部陣亡~

PHP fpm

PHPBrew同時(shí)也為 php-fpm 提供了管理指令(前提是在構(gòu)建的時(shí)候得加上 +fpm variant)

啟動(dòng)/停止/重啟 php-fpm:

$ phpbrew fpm start
$ phpbrew fpm stop 
$ phpbrew fpm restart 

顯示 php-fpm 模塊:

$ phpbrew fpm module
[PHP Modules]
bz2
cgi-fcgi
Core
ctype
curl
...

[Zend Modules]
Xdebug

測試 php-fpm 配置是否正確:

$ phpbrew fpm test
[01-Dec-2020 18:28:04] NOTICE: configuration file /Users/chaos/.phpbrew/php/7.4.13/etc/php-fpm.conf test is successful

編輯 php-fpm 配置:

$ export EDITOR=vim # 該行為可選項(xiàng),指定你常用的編輯器
$ phpbrew fpm config

已安裝的 php-fpm 位于 $HOME/.phpbrew/php/{php-version}/sbin

相應(yīng)的 php-fpm.conf 位于 $HOME/.phpbrew/php/{php-version}/etc/php-fpm.conf.default, 你可以將默認(rèn)配置文件拷貝到需要的位置進(jìn)行使用,比如

$ cp -v ~/.phpbrew/php/{php-version}/etc/php-fpm.conf.default ~/.phpbrew/php/{php-version}/etc/php-fpm.conf

$ php-fpm --php-ini ~/.phpbrew/php/{php-version}/etc/php.ini --fpm-config ~/.phpbrew/php/{php-version}/etc/php-fpm.conf

安裝擴(kuò)展應(yīng)用

~通過 app get 指令來安裝例如 composerphpunit 這樣的 app,筆者親測該指令也已陣亡~

結(jié)尾

以上便是筆者結(jié)合 PHPBrew 官方文檔給大家梳理的使用指南,寫該文時(shí)每條指令筆者都親自測試過,所以發(fā)現(xiàn)了官方文檔里有很多地方都 已過時(shí)已更新。對(duì)于前者,筆者用橫線給劃掉了;對(duì)于后者,筆者直接進(jìn)行了修正。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容