PHP的多版本环境管理

多版本的不同环境开发可以方便测试代码在不同语言版本的差异表现或者兼容性,Ruby有rbenv,Python有virtualenv,NodeJs有nvm,那PHP是不是应该也有,事实上到目前位置PHP都没有这种专门的多版本环境软件,但确实有一款可以用的phpenv

phpenv是基于rbenv扩展出来的PHP多版本管理软件,所以请注意如果一个目录既有ruby版本设置又有php版本设置肯定会冲突。但一般这种情况比较少,下面就来介绍下如何来使用它!

安装

1
2
3
git clone git://github.com/CHH/phpenv.git
cd phpenv
phpenv-install.sh

如果需要更新

1
UPDATE=yes phpenv-install.sh

配置

.bashrc或者.zshrc添加

1
2
export PATH=$HOME/.phpenv/shims:$PATH:$HOME/.phpenv/bin
eval "$(phpenv init -)"

上面两句第一句是优先导入phpenv的PATH来找到php解释器,下面是自动提示。

多版本

PHP的版本要不然自己编译,要不然…还有一个工具php-build可以来配合使用达到多版本配合使用,虽然不是非常好用,最起码也能用。关于php-build的安装就不多说了,大家可以参照其官网来安装,也是非常简单的。

据说travis-ci已经在使用php-build作为多版本管理工具

执行

1
php-build --definitions

就可以看到所有支持的版本,如果要编译,执行类似下面的命令即可。

1
php-build 5.4.2 ~/.phpenv/versions/5.4.2

查看当前安装的PHP版本

1
phpenv versions

安装完新版本需要执行下面的语句来分配可执行脚本到shims目录

1
phpenv rehash

为了更好的控制编译参数,也可以自己手动编译,将编译好的目录拷贝或者link到~/.phpenv/versions/版本号即可。

使用

有一些命令versionsrehash在前面一节已经介绍过了,这里不再多说。

设置当前目录的PHP版本

1
phpenv local 5.4.2

设置系统的PHP版本

1
phpenv global php5.3.23

查看在当前位置使用的PHP版本

1
phpenv version

如果不确定当前的版本是否设置完成,可以用下面的来确认

1
php -v

原理

其实这个原理就是rbenv的原理了,我说下大致的理解。

首先设置了优先的执行路径~/.phpenv/shims,这个目录会有一些类似于PHP可执行二进制文件,其实这里只是个bash脚本

1
2
3
4
#!/usr/bin/env bash
set -e
export RBENV_ROOT="/Users/hfcorriez/.phpenv"
exec rbenv exec "${0##*/}" "$@"

它执行了rbenv,然后rbenv会检查你当前位置和用户目录的.rbenv-version(优先使用当前位置的文件),通过这个文件里面的版本号,找到~/.phpenv/versions中配置的版本,然后将命令行交给该版本对应的bin去执行。

其他关于rbenv的原理解释:How do RVM and RBEnv actually work?

扩展:Web服务器的多版本支持

因为PHP的特性,目前的大版本(5.4-)还不支持作为服务器运行,而且大家都习惯用Apache或Nginx来作为运行PHP的容器。

如果要在Nginx服务器下使用多环境的PHP是比较简单的,启动对应版本的php-fpm就可以搞定。

如果Apache就稍微费劲一点了,前段时间@sofish果然有这个需求。

在Google和Github的帮助下找到了phpenv-apache-version这个phpenv的扩展可以解决这个问题,但这个模块很多参数写的比较死,如果要用的话有些目录需要抽出来可配或者写成自己的。

如果不想费劲。其实解释起来也比较简单,就是将/usr/libexec/apache2/libphp5.so这个PHP5模块进行更换,所以编译的PHP必须要有这个Apache模块,可以通过--with-apxs2=/usr/sbin/apxs编译参数来编译就可以了。

写在后面

多版本大多在测试的情况下比较有用,如果对你有用还是好好的利用起来,欢迎各位留言拍砖!

Comments