当前位置: 首页 > 工具软件 > PHPBrew > 使用案例 >

使用phpbrew在mac和linux上管理多版本php

陆和泰
2023-12-01

phpbrew简介

phpbrew是一个php版本管理的命令行工具,用于在同一台机子上同时管理几个php版本,在linux和mac上都可以安装这个工具,目前这个工具在github上维护

github.com/phpbrew/php…

为什么要用phpbrew

对我而言,我需要在MAC上运行多个php版本,所以phpbrew是一个不错的选择,其实使用普通的homebrew安装或者通过编译安装也可以安装多个版本的php,但是步骤麻烦,而且管理php的一些库例如GD库、PDO库等都不是很方便,phpbrew可以快速地安装管理这些库。并且快速在多版本之间进行切换,使用起来非常方便。

先说说我要解决的问题和一些原理

我经常用php+nginx开发网站,常用的版本是5.6,以前开发的时候有一些框架需要5.4版本,有一些需要5.6版本,然后php7的版本也已经发布许久了,下来肯定有一些框架要求>7版本,在维护旧框架和搭建新框架的需求下,多版本php是避免不了的。对于我来说,有两个办法,一个是自己安装多版本,然后通过不同命令区分多版本,另一个办法就是用phpbrew进行管理,两个办法我都试过,这里我先简单说一下原理,再对比一下两个方法的优劣。

自己安装多版本php:

自己安装多版本的php,比如利用MAC的homebrew、利用Ubuntu和CentOS的apt和yum,都可以安装php,自虐的猿可以编译安装,安装完第一个php后,在自己的系统目录下一般都会有一个PHP命令(一般在/usr/local/bin下),命令行输入:

php -v
复制代码

就会返回版本信息,假设我先安装5.6版本,那么返回的就是5.6版本的信息。关于利用apt或者homebrew安装PHP的详细方法这里不再累赘,网上有很多。

接下来就是继续安装第二个版本,但是问题来了,安装了两个版本,输入:php -v,会返回哪个版本信息呢?这个取决于你的php命令是哪一个?一般来说第一个安装的版本会在bin目录下创建一个软链,而第二个版本由于检测到第一个版本创建的软链,就不会再创建了,所以如果两个版本都安装后输入php -v,应该会显示第一个版本的信息。我的解决办法是,以mac为例,创建一个新的命令 php54 ,用来区分两个版本的php命令,方法是在 ~/.bash_profile文件中添加一个命令别名

alias php54 = '/path/to/php54/bin/php'
复制代码

其中‘/path/to/php54/bin/php’是你安装php5.4版本的目录,然后记得source一下

source ~/.bash_profile
复制代码

这样输入

 php54 -v
复制代码

返回的就是php5.4的版本的信息了。

结合nginx服务器运行多版本php

直接在终端运行php命令还是比较少,主要还是结合nginx,nginx配合php的原理是运行一个叫做php-fpm的程序,将*.php页面的请求交给php-fpm这个程序处理,那么如果需要两个版本的php,就让两个版本的php-fpm程序运行在不同的端口就行了,比如运行在9000和9001两个端口,nginx分发请求到不同端口就是不同版本的php了。

php-fpm程序一般在安装php的时候就会附带在里面,那么同样的,你运行sudo php-fpm的时候(记得php-fpm需要管理员权限运行),运行的肯定是第一个php5.6版本的,可以通过php-fpm -v查看版本,这时应该先修改php-fpm的运行端口,具体方法是找到php5.6的安装目录,然后找到php-fpm.conf配置文件,在配置文件中添加一行:

listen 127.0.0.1:9000
复制代码

如果已经有listen这一行了,可以先在前面加一个;分号注释掉再添加上面那一句,之后重启一下php-fpm的进程,这样5.6版本的fpm就运行起来了,之后在~/.bash_profile文件中添加一个命令别名

alias php-fpm54 = '/path/to/php54/sbin/php-fpm'
复制代码

其中‘/path/to/php54/sbin/php-fpm’是你安装php5.4版本的目录,同样记得source一下,此举的目的跟上面相同,做了一个区别于php-fpm的命令,之后修改php-fpm5.4版本的配置文件,在配置文件中添加

listen 127.0.0.1:9001
复制代码

然后,运行命令: sudo php-fpm54,这样就在9001端口启动了5.4版本的fpm进程。

接下来要做的就简单了,在写nginx的网站配置文件时,如果需要php5.6版本的网站,配置文件就写

server {
    listen       80;
    server_name  www.website1.com;
    root /path/to/web/folder1;
    index  index.php index.html index.htm;

    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        #fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}   
复制代码
server {
    listen       80;
    server_name  www.website2.com;
    root /path/to/web/folder2;
    index  index.php index.html index.htm;

    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9001;
        #fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}   
复制代码

两个配置文件的唯一不同就是把9000修改成9001。这样就搞定了~,nginx会根据进来的请求,将请求分发到不同的端口从而决定不同的版本。其中website1用的是php5.6版本,website2用的是php5.4版本。

这个方法的一大特点就是:折腾>_<,但对于新手或者刚接触linux的人来说,练练手,熟悉环境和一些原理,我觉得是不错的,起码走过一遍之后可以掌握很多知识。而对于想要方便管理的人而言,就不需要了,直接上phpbrew。

phpbrew管理多php版本

说完自己安装的方法,接下来就说说phpbrew。

安装前的准备

安装phpbrew有一些前置要求,官方文档的Requirement在这里

github.com/phpbrew/php…

不同系统的前置要求不太一样,找到自己系统那一部分根据里面的命令安装就好了,这里特别强调一下,使用phpbrew要求你的系统里至少已经有一个php版本了,而且要5.3+,所以一个php版本都没有的同学,是用不了phpbrew的,必须先安装一个php,安装的方式见上面,用yum、apt、homebrew。

安装phpbrew

安装好前置要求之后,就安装phpbrew,方法在官网这里,

github.com/phpbrew/php…

我贴出来:

curl -L -O https://github.com/phpbrew/phpbrew/raw/master/phpbrew
chmod +x phpbrew
sudo mv phpbrew /usr/local/bin/phpbrew
复制代码

安装完成后,运行phpbrew -v应该也能看到版本信息,之后运行初始化命令

phpbrew init
复制代码

初始化后,会在~文件夹中产生一下.phpbrew的文件夹和一些文件,在~/.bashrc文件中添加

echo "[[ -e ~/.phpbrew/bashrc ]] && source ~/.phpbrew/bashrc" >> ~/.bashrc
复制代码

这一行,然后source一下:

source ~/.phpbrew/bashrc
复制代码

这样就算完成phpbrew的安装了。

接下来就是要通过phpbrew来安装不同的php版本。

首选运行一下:

phpbrew update
复制代码

更新一下php版本库的信息

然后运行

phpbrew known
复制代码

查看可以安装的php版本

接下来就是选择一个版本去安装,假设之前我已经安装过5.4版本了,那么我继续安装5.6版本,

phpbrew install 5.6 +default +fpm +mysql +gd
复制代码

这里后面的+ xxx就是添加一些库和功能,比如最基本的默认库,还有连接数据库用到mysql库,连接nginx的php-fpm都是必须的,我就一次性加上去,等待几分钟后,就安装完成了。

接下来运行:

phpbrew list
复制代码

就会列出你已经安装的版本,值得一提的是有一个(system)版本的,其实就是一开始安装phpbrew需要先有的那个版本,运行:

phpbrew switch 5.6.40
复制代码

切换到最新安装的这个版本,运行php -v可以看到,你已经切换成功了。

问题到这里还没完,如何切换回5.4版本呢?这时,其实你还要在phpbrew内再安装一下php5.4的版本,虽然你一开始就有这个版本了,但是它并没有纳入到phpbrew的管理,所以这个时候你可以再安装多一个5.4版本,不用害怕重复,通过phpbrew安装的版本都会在~/.phpbrew 文件夹中,不会互相影响而且很方便找到。运行:

phpbrew install 5.4 +default +fpm +mysql +gd
复制代码

安装完成后,运行:

phpbrew list
复制代码

你会看到多了一个版本,利用switch命令进行切换,这样你就能在不同版本的php之间进行切换了。

对于php-fpm,跟上面提到的原理是一样,找到他们的配置文件(在~/.phpbrew文件夹中),然后修改运行的端口,一个在9000一个在9001,然后运行两个fpm程序,官方文档中有详细的运行方法,

phpbrew switch 5.6
sudo phpbrew fpm start
phpbrew switch 5.4
sudo phpbrew fpm start
复制代码

这里注意fpm程序需要有管理员权限去运行,切换不同版本运行不同的fpm程序,这样就能同时启动两个fpm程序在不同的端口,nginx的配置跟上文一样。

至此,phpbrew的应用也就ok了。

关于phpbrew管理扩展库

关于php扩展库,在phpbrew中称为variants,运行:

phpbrew variants
复制代码

可以知道你安装了哪些扩展库,我碰到过一个问题就是运行:phpbrew install 5.6 +default +fpm +mysql +gd的时候,提示GD没有安装,在官方文档中我也找到了,可以通过运行:

phpbrew ext install gd -- --with-gd=shared \
    --with-png-dir=/usr/local/opt/lib \
    --with-jpeg-dir=/usr/local/opt/jpeg \
    --with-freetype-dir=/usr/local/opt/freetype  \
    --enable-gd-native-ttf
复制代码

来添加GD扩展。

更多的操作,朋友们自己看官方文档了,我一直认为,一千一万个教程,都不如直接看官方文档来的实在。所以,英文能力呀(两行泪T_T)

一些坑

安装好phpbrew之后,利用phpbrew安装第一个php版本,然后切换到这里来,这样子原先system里面的那个php版本就可以删掉了。把所有的php版本都通过phpbrew来安装,方便管理。

安装的时候,建议加上 +default这个基础的库,这里有一个教训,为了安装GD库,我重新安装了一个php版本,运行的是:phpbrew install 5.6 +mysql +gd,结果出事了,报了一个错,缺少json库,原因就是我没有+default,而我以为第一次已经有加了第二次可以不用+default,事实上,每次安装都必须全部加上去,全部加上去,全部加上去,全部加上去!因为它是全部重新安装的!

然后系统的版本又被我删了,这个版本安装错误等于废了,就等于我系统里一个php版本也没有,phpbrew也就运行不了了(又是两行泪T_T),如何解决,重走一遍上面那些步骤呗......

以上就是我对于多php版本管理和使用phpbrew的一些心得,如果有什么改正意见的,欢迎给我留言指出。谢谢你的耐心观看。

 类似资料: