phpbrew+nginx打造多版本php开发环境

苦于Mac平台上没有类似于phpstudy这样的免费的集成开发环境,MAMP功能不够强大,Pro版又太贵了,MxSrvs这种的免费集成开发环境定制性不强。docker一个个编译安装部署又太过于麻烦,尝试了很多方法,踩了不少坑,最后决定在本地用phpbrew和nginx来实现多版本php集成开发环境。

1. 安装

首先需要安装三个东西

  1. Homebrew
  2. Nginx
  3. phpbrew

1.1 安装Homebrew

HomeBrew是Mac上的包管理器,非常好用。

一条命令就能安装

1
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

1.2 安装Nginx

使用Homebrew可以很容易的安装nginx,默认的是安装Nginx最新版

1
brew install nginx

安装完毕后可以查看Nginx版本

1
2
$ nginx -v
nginx version: nginx/1.15.8

1.3 安装PHPbrew

PHPbrew 是个多平台的php管理工具。在这里只列出我配置时的一些操作,具体请移步PHPbrew的wiki

  • 安装依赖

对于Homebrew,则就是

1
2
3
4
5
xcode-select --install
brew install automake autoconf curl pcre bison re2c mhash libtool icu4c gettext jpeg openssl libxml2 mcrypt gmp libevent
brew link icu4c
brew link --force openssl
brew link --force libxml2

对于后面的三个link操作,我这里都会出警告:

1
Warning: Refusing to link macOS-provided software:xxx

猜测是SIP的问题,但是不想关SIP,就直接按照brew的提示直接把路径添加到环境变量里了。

  • 下载phpbrew。
1
2
3
curl -L -O https://github.com/phpbrew/phpbrew/raw/master/phpbrew
chmod +x phpbrew
sudo mv phpbrew /usr/local/bin/phpbrew
  • 初始化phpbrew
1
phpbrew init
  • 接着在 .zshrc 文件增加如下行(如果是命令行是Bash,那就在用户目录.bashrc下添加)
1
[[ -e ~/.phpbrew/bashrc ]] && source ~/.phpbrew/bashrc
  • 然后设置库路径
1
phpbrew lookup-prefix homebrew

2. PHPbrew 简单使用方法

2.1 PHP版本获取

列出已经安装的php

1
phpbrew list

列出已知的PHP版本

1
2
3
4
5
6
7
8
9
$ phpbrew known
7.3: 7.3.1, 7.3.0 ...
7.2: 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.1: 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.0: 7.0.33, 7.0.32, 7.0.31, 7.0.30, 7.0.29, 7.0.28, 7.0.27, 7.0.26 ...
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 ...

使用 --more参数可以列出更多版本

1
phpbrew known --more

使用--old参数可以列出已知的旧版本

1
phpbrew known --old

2.2 获取PHP编译参数

列出php的一些编译参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
$ 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, ldap, libgcc, mbregex, mbstring, mcrypt, mhash, mysql,
opcache, openssl, pcntl, pcre, pdo, pear, 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, 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, icu, openssl, mysql, sqlite, pgsql, xml, xml_all,
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

2.3 编译PHP

默认配置安装PHP:

1
phpbrew install 5.4.40 +default

测试安装:

1
phpbrew install --test 5.4.40

显示debug信息:

1
phpbrew -d install --test 5.4.40

安装旧版本:

1
phpbrew install --old 5.2.13

2.4 PHP使用和切换

临时使用:

1
phpbrew use 5.4.40

切换版本(设置默认版本):

1
phpbrew switch 5.4.40

关闭phpbrew:

1
phpbrew off

3. 配置过程

首先编译需要的PHP版本,在此我使用php-fpm来实现PHP和Nginx通信,需要在编译php时,添加+fpm参数。

3.1 编译php

在之前我已经配置好了php-5.6.40,在此我以php 7.2.14为例,再进行一次配置。

1
phpbrew install 7.2.14 +default +fpm +dbs +mb +bz2=/usr/local/Cellar/bzip2/1.0.6_1 +zlib=/usr/local/Cellar/zlib/1.2.11

在这里,直接使用phpbrew install 7.2.14 +default +fpm进行编译,程序找不到bzip2和zlib的路径,需要手动指定该路径。后面在添加一些配置参数时,如果报错说xxx不存在,而且你已经使用brew安装了的话,可以用该方法手动指定路径。

接下来phpbrew会自动下载并编译该版本,在我电脑上大概需要7分钟。

然后切换到php 7.2.14。

1
2
3
4
5
$ phpbrew switch php-7.2.14
$ php -v
PHP 7.2.14 (cli) (built: Jan 28 2019 23:20:43) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

可以看到php 7.2.14已经安装成功了。

3.2 修改配置文件

首先修改php-fpm的配置文件。

phpbrew的默认安装目录是在用户家目录下的.phpbrew文件夹中。

首先修改php-fpm的配置文件,在我电脑上,也就是/Users/mengchen/.phpbrew/php/php-7.2.14/etc

打开php-fpm.d目录下的www.conf配置文件。对其做以下修改

1
2
3
4
为了避免一些权限问题,我直接使用当前用户来启用php-fpm。
;user = nobody
;group = nobody
listen = 127.0.0.1:9000

启动php-fpm

1
phpbrew fpm start

接下来修改Nginx配置文件,路径/usr/local/etc/nginx/nginx.conf

在这里,我把我的web目录放到了/Users/mengchen/www下,Nginx监听端口修改为80端口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
server {
listen 80;
server_name localhost;

location / {
root /Users/mengchen/www;
index index.html index.htm index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /Users/mengchen/www$fastcgi_script_name;
include fastcgi_params;
}
}
}

Nginx检查配置文件,然后重新加载配置文件

1
2
3
4
$ sudo nginx -t
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful
$ sudo nginx -s reload

在Web目录下创建index.php文件来做测试

1
2
3
4
<?php
system('whoami');
phpinfo();
?>

直接访问http://localhost/index.php

1

为了安全性,可以只允许本机来访问Nginx,本来就是本地开发环境,影响不大。

也可以使用Apache来代替Nginx,配置文件不太一样,不过本质都是使用FPM来进行通信,在此就不详细列了。

3.3 php版本切换脚本

所有的php-fpm都配置的是监听127.0.0.1:9000,因此不需要对Nginx进行修改,直接修改当前php-fpm版本即可实现php的版本切换。

写一个shell函数,保存在~/.phpbrew/phpchange文件下。

1
2
3
4
5
function phpchange(){
phpbrew fpm stop;
phpbrew switch ${1};
phpbrew fpm start;
}

然后在~/zshrc文件末尾添加

1
source ~/.phpbrew/phpchange

然后就可以直接在shell里面切换php版本了。

1
phpchange 5.6.40

此时访问index.php,版本成功切换到了php 5.6.40

2