PHPBrew - 安装多版本 PHP 到用户根目录的工具


MIT
Linux
PHP

软件简介

phpbrew 是一个构建、安装多版本 PHP 到用户根目录的工具。

phpbrew 能做什么?

  • 配置选项简化为「Variants」,无需担心路径问题。
  • 支持使用 PDO,mysql,sqlite,debug 等不同「Variants」编译 PHP。
  • 针对不同版本,分别编译 apache php 模块,互不冲突。
  • 无需 root 权限将 PHP 安装到用户根目录。
  • 集成至 bash / zsh shell 等,易于切换版本。
  • 支持自动特性检测。
  • 易于安装、启用 PHP 扩展。
  • 支持在系统环境下安装多个 PHP。
  • 路径检测针对 HomeBrew 以及 MacPorts 进行了优化。

安装需求

在开始之前,请先查看:Requirement(英文)。
确保已安装依赖包的开发版本用于编译 PHP。

安装

curl -L -O https://github.com/phpbrew/phpbrew/raw/master/phpbrew
chmod +x phpbrew

# Move phpbrew to somewhere can be found by your $PATH
sudo mv phpbrew /usr/local/bin/phpbrew

快速入门

急不可待?请直接查看:Quick Start(英文)。

开始使用

接下来,我们假定你有充足的时间来学习,这将会是一个循序渐进的教程——教你如何配置 phpbrew。

初始设置

首先,初始化 Bash Shell 脚本:

phpbrew init

接着在 .bashrc.zshrc 文件增加如下行:

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

对于 Fish shell 用户,在 ~/.config/fish/config.fish 文件增加如下行:

source ~/.phpbrew/phpbrew.fish

若需要在系统全局(非用户目录)使用 phpbrew,请设置共享的 phpbrew 根目录,例如:

mkdir -p /opt/phpbrew
phpbrew init --root=/opt/phpbrew

库路径设置

其次,请设置用于查找库文件的默认前缀,可选值有 macportshomebrewdebianubuntu 或是自定义路径。

对于 Homebrew 用户:

phpbrew lookup-prefix homebrew

对于 Macports 用户:

phpbrew lookup-prefix macports

基础用法

列出已知 PHP 版本:

phpbrew known

7.0: 7.0.3, 7.0.2, 7.0.1, 7.0.0 ...
5.6: 5.6.18, 5.6.17, 5.6.16, 5.6.15, 5.6.14, 5.6.13, 5.6.12, 5.6.11 ...
5.5: 5.5.32, 5.5.31, 5.5.30, 5.5.29, 5.5.28, 5.5.27, 5.5.26, 5.5.25 ...
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 ...

列出更多次要版本:

$ phpbrew known --more

刷新 PHP 发布信息:

$ phpbrew update

刷新旧版本(低于5.4):

请注意:我们不保证能够正确编译 PHP 官方停止维护的版本,请不要提交关于编译旧版本的 Issus,此类 Issue 将不会修复。

$ phpbrew update --old

列出已知的旧版本(低于5.4):

$ phpbrew known --old

编译属于你的 PHP

使用默认参数编译安装 PHP 非常简单:

$ phpbrew install 5.4.0 +default

这里我们推荐使用已包含绝大多数公共参数的 default(默认)参数集合。如果你需要「最小安装」,删掉default执行即可。

你可以使用-j--jobs选项启用并行编译,例如:

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

编译完成后执行测试用例:

$ phpbrew install --test 5.4.0

测试环境,且包含调试信息:

$ phpbrew -d install --test 5.4.0

安装旧版本(低于5.3):

$ phpbrew install --old 5.2.13

安装给定主要版本的最新次要版本:

$ phpbrew install 5.6

安装预览版本:

$ phpbrew install 7.2.0alpha1
$ phpbrew install 7.2.0beta2
$ phpbrew install 7.2.0RC3

通过指定的 GitHub tag 或 branch 安装:

$ phpbrew install github:php/php-src@PHP-7.2 as php-7.2.0-dev

安装下一个(非稳定)版本:

$ phpbrew install next as php-7.3.0-dev

清除编译目录

$ phpbrew clean php-5.4.0

Variants

PHPBrew 已经将配置选项整理、合并为「Variants」,你只需简单地指定某个 Variant 即可,phpbrew
会自动在配置过程中检测引用目录、编译选项等。

PHPBrew 提供默认的 Variant ,以及一些虚拟 Variants。 「Default Variant」包含绝大多数公共 Variants;
「Virtual Variants」可包含多个 Variants,使用一个虚拟 Variant 即可一次性启用多个 Variants。

只需执行variants子命令,即可列出它们:

$ 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, icu, imap, inifile, inline, intl, ipc, ipv6,
  json, kerberos, libgcc, mbregex, mbstring, mcrypt, mhash, mysql, opcache,
  openssl, pcntl, pcre, pdo, pgsql, phar, phpdbg, posix, readline, session,
  soap, sockets, sqlite, static, tidy, tokenizer, wddx, xml, xml_all, 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, mcrypt, pcntl, pcre, pdo, 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, tidy, kerberos, xmlrpc, fpm, dtrace, pcre, mhash,
              mcrypt, zlib, curl, readline, editline, gd, intl, icu, openssl,
              mysql, sqlite, pgsql, xml, xml_all, gettext, iconv, bz2, ipc, gmp


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 前添加+前缀,代表启用此 Variant,例如:

+mysql

在 Variant 前添加-前缀,代表禁用此 Variant,例如:

-mysql

举个例子,假设你使用默认 Variant,并且需要启用数据库支持(mysql,sqlite,postgresql)编译 PHP,只需执行:

$ phpbrew install 5.4.5 +default+dbs

也可以:

$ phpbrew install 5.3.10 +mysql+sqlite+cgi

$ phpbrew install 5.3.10 +mysql+debug+pgsql +apxs2

$ phpbrew install 5.3.10 +pdo +mysql +pgsql +apxs2=/usr/bin/apxs2

将 pgsql (PostgreSQL) 扩展编译进 PHP:

$ phpbrew install 5.4.1 +pgsql+pdo

若你的 Mac 上已经安装 postgresql,也可以指定特定目录编译 pgsql 扩展:

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

pgsql 的路径即为pg_config所在目录,你可以在/opt/local/lib/postgresql91/bin找到它。

另外,你可以使用名为neutral的 Variant 来纯净编译 PHP:

$ phpbrew install 5.4.1 +neutral

neutral意味着 phpbrew 不会增加包括--disable- all在内的任何额外编译参数,但部分用于安装pear的参数(例如--enable-libxml)依旧会被添加。

更多细节,请移步:PHPBrew Cookbook(英文)。

拓展配置选项

如果想要传递更多拓展配置变量,你可以这么做:

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

切换 PHP 版本

临时切换 PHP 版本:

$ phpbrew use 5.4.22

切换默认 PHP 版本:

$ phpbrew switch 5.4.18

关闭 phpbrew:

$ phpbrew off

若需要启用 Apache PHP 模块,请注释或移除以下设置项:

$ sudo vim /etc/httpd/conf/httpd.conf
# LoadModule php5_module        /usr/lib/httpd/modules/libphp5.3.21.so
# LoadModule php5_module        /usr/lib/httpd/modules/libphp5.3.20.so

扩展安装器

请查看:Extension Installer(英文)。

配置 php.ini

配置当前 PHP 版本的 php.ini 文件,只需执行如下命令即可:

$ phpbrew config

如需切换编辑器,可执行如下命令指定 EDITOR 环境变量:

export EDITOR=vim
phpbrew config

升级 phpbrew

执行 self-update 即可从 GitHub 的 master 分支安装 phpbrew 最新版本。

$ phpbrew self-update

已安装的 PHP

列出已安装的 PHP:

$ phpbrew list

你可以在 ~/.phpbrew/php 目录找到已安装的 PHP。例如,5.4.20 版本位于:

~/.phpbrew/php/5.4.20/bin/php

你可以手动修改其 php.ini:

~/.phpbrew/php/5.4.20/etc/php.ini

而 PHP 扩展的配置文件位于:

~/.phpbrew/php/5.4.20/var/db
~/.phpbrew/php/5.4.20/var/db/xdebug.ini
~/.phpbrew/php/5.4.20/var/db/apc.ini
~/.phpbrew/php/5.4.20/var/db/memcache.ini
等等...

一键切换目录

切换至 PHP 编译目录:

$ phpbrew build-dir

切换至 PHP dist 目录:

$ phpbrew dist-dir

切换至 PHP etc 目录:

$ phpbrew etc-dir

切换至 PHP var 目录:

$ phpbrew var-dir

PHP FPM

phpbrew 内置一些有用的命令用于管理 php-fpm。使用它们之前,请确认在 PHP 编译时启用了 +fpm

启动 php-fpm:

$ phpbrew fpm start

停止 php-fpm:

$ phpbrew fpm stop

列出 php-fpm 模块:

phpbrew fpm module

测试 php-fpm 配置:

phpbrew fpm test

编辑 php-fpm 配置:

phpbrew fpm config

已安装的 php-fpm 位于 ~/.phpbrew/php/php-*/sbin 目录。

对应的 php-fpm.conf 文件位于 ~/.phpbrew/php/php-*/etc/php-fpm.conf.default 目录。

你可以把默认配置复制到自定义路径再使用,例如:

cp -v ~/.phpbrew/php/php-*/etc/php-fpm.conf.default
    ~/.phpbrew/php/php-*/etc/php-fpm.conf

php-fpm --php-ini {php config file} --fpm-config {fpm config file}

安装拓展应用

phpbrew 内置了用来获取部分 PHP 应用的 app 命令。

安装 Composer

$ phpbrew app get composer

安装 PHPUnit

phpbrew app get phpunit

启用版本信息 Prompt

使用"PHPBREW_SET_PROMPT=1"变量可将 PHP 版本信息加入 Shell Prompt。

此变量默认值为"PHPBREW_SET_PROMPT=0"(即禁用),将如下行加入~/.bashrc文件,确保其在source ~/.phpbrew/bashrc之前,即可启用此功能:

export PHPBREW_SET_PROMPT=1

使用.phpbrew/bashrc内定义的phpbrew_current_php_version函数,可将版本信息嵌入到 Shell
Prompt。你可以将版本信息设置到 PS1 变量内,例如:

PS1=" \$(phpbrew_current_php_version) \$ "

已知问题

  • 对于 PHP-5.3+ 版本,”Building intl 64-bit fails on OS X” https://bugs.php.net/bug.php?id=48795

  • 将 GD 扩展编译进 PHP,你需要指定 libpng 目录、libjpeg 目录,例如:

$ phpbrew install php-5.4.10 +default +mysql +intl +gettext
+apxs2=/usr/bin/apxs2
-- –with-libdir=lib/x86_64-linux-gnu
--with-gd=shared
--enable-gd-natf
--with-jpeg-dir=/usr
--with-png-dir=/usr

故障排查

请移步:TroubleShooting(英文)。

常见问答

Q: 如何使用不同的参数编译相同 PHP 版本?

A: 截至目前,你可以安装 php-5.x.x 并重命名其目录
/Users/phpbrew/.phpbrew/php/php-5.x.x(例如:php-5.x.x-super),并安装另一个 php5.x.x。