/ Multiple Version / PHP / Python / macOS / Homebrew

macOS下PHP与Python的多版本环境共存

对于一个开发人员来说,经常要面对不同的开发环境、测试环境、线上环境……很多时候这些环境的配置并不一致,原因太多就不赘述了。要是能在一台机器上配置多个不同的环境,需要的时候可以方便的在这些环境中进行切换,至少不是件坏事,而且这在很多系统上,实现起来并不难。

macOS是自带了php、python和ruby的,升级到High Sierra后,php的版本是7.1.7,python的版本是2.7.10,ruby的版本是2.3.3。我猜大部分的程序开发者都像我一样,不会使用系统自带的运行环境,我们更多的会选择手动安装,或者选择另外的包管理工具,比如MacPorts或者Homebrew

其实我本来是MacPorts的粉儿,升级到High Sierra后,我转粉了Homebrew。很难说两者孰优孰劣,我改投Homebrew的最主要原因是它不需要sudo。至于Homebrew的安装,我想应该就不用我说了。好啦,Talk is cheap!放码~

PHP

“PHP是世界上最好的编程语言!”作为LNMP的忠实粉儿,这句话总是在我提到PHP时余音绕梁般浮现在我脑中!果然是真爱啊!公司的项目后端主要是PHP栈,虽然现在PHP的版本已经7.2了,但是由于历史原因,当前线上环境还是跑的5.6,我们还用的Phalcon框架,它的Release版本已经是3.3,但我们线上还停留在2时代。于是乎,我也会纠结于安装哪个版本?PHP56+Phalcon2吧,无法体验到PHP新版本的特性,技术总要面向未来啊;PHP7+Phalcon3吧,项目代码的执行就会有问题了!所以,对我来说,最理想的还是两个环境都有,只要彼此不冲突,可以随时切换就好。好在,Homebrew是可以实现这个需求的!

先tap:

$ brew tap homebrew/homebrew-php

然后我们先来安装PHP72:

$ brew install php72 php72-phalcon

* 当然这里你可以安装其他你需要的PHP扩展。

接下来我们安装PHP56

安装之前要unlink php72

$ brew unlink php72

安装php56

$ brew install php56

安装Phalcon2扩展(由于Homebrew自带的php56-phalcon扩展版本是3.3,所以这里我选择从代码编译安装):

$ git clone git://github.com/phalcon/cphalcon.git
$ cd cphalcon
$ git checkout 2.0.x
$ cd ext
$ ./install 

* 这里我用cphalcon/ext替换了官方文档中使用的cphalcon/build进行安装,因为使用build运行时会出现一些难以预料的问题,可能是某些编译参数不同的原因。

install成功最后会看到这样的信息:

Build complete.
Don't forget to run 'make test'.

Password:
Installing shared extensions:     /usr/local/Cellar/php56/5.6.xx_x/lib/php/extensions/no-debug-non-zts-20131226/
Installing header files:           /usr/local/Cellar/php56/5.6.xx_x/include/php/

添加php扩展:

$ vi /usr/local/etc/php/5.6/conf.d/ext-phalcon.ini

内容如下:

[phalcon]
extension="/usr/local/Cellar/php56/5.6.xx_x/lib/php/extensions/no-debug-non-zts-20131226/phalcon.so"

当然其实我们还可以用brew create来新建一个phalcon2的Formula,这种方式更方便用homebrew来维护:

$ brew create https://github.com/phalcon/cphalcon/archive/phalcon-v2.0.13.tar.gz --tap homebrew/homebrew-php

上面命令会创建一个/usr/local/Homebrew/Library/Taps/homebrew/homebrew-php/Formula/cphalcon.rb文件,我们可以把这个文件重命名:

$ mv /usr/local/Homebrew/Library/Taps/homebrew/homebrew-php/Formula/cphalcon.rb /usr/local/Homebrew/Library/Taps/homebrew/homebrew-php/Formula/php56-phalcon2.rb 

然后修改这个文件:

$ vi /usr/local/Homebrew/Library/Taps/homebrew/homebrew-php/Formula/php56-phalcon2.rb

内容如下:

require File.expand_path("../../Abstract/abstract-php-extension", __FILE__)
  
class Php56Phalcon2 < AbstractPhp56Extension
  init
  desc "High performance, full-stack PHP framework delivered as a C extension."
  homepage "https://phalconphp.com"
  url "https://github.com/phalcon/cphalcon/archive/phalcon-v2.0.13.tar.gz"
  sha256 "0a1bd6afe902c6f2f68cf5e2f2785503f5ad95d1d2cf1b66c77154c483a08a35"

  depends_on "pcre"

  def install
    Dir.chdir "build/64bits"

    safe_phpize
    system "./configure", "--prefix=#{prefix}",
                          phpconfig,
                          "--enable-phalcon"
    system "make"
    system "mv", "modules/phalcon.so", "modules/phalcon2.so"
    prefix.install "modules/phalcon2.so"
    write_config_file if build.with? "config-file"
  end
end

然后执行brew install php56-phalcon2,大概会看到类似如下的输出:

==> Installing php56-phalcon2 from homebrew/php
==> Downloading https://github.com/phalcon/cphalcon/archive/phalcon-v2.0.13.tar.gz
Already downloaded: /Users/devylee/Library/Caches/Homebrew/php56-phalcon2-2.0.13.tar.gz
==> /usr/local/opt/php56/bin/phpize
==> ./configure --prefix=/usr/local/Cellar/php56-phalcon2/2.0.13 --with-php-config=/usr/local/opt/php56/bin/php-config --enable-phalcon
==> make
==> mv modules/phalcon.so modules/phalcon2.so
==> Caveats
To finish installing phalcon2 for PHP 5.6:
  * /usr/local/etc/php/5.6/conf.d/ext-phalcon2.ini was created,
    do not forget to remove it upon extension removal.
  * Validate installation via one of the following methods:
  *
  * Using PHP from a webserver:
  * - Restart your webserver.
  * - Write a PHP page that calls "phpinfo();"
  * - Load it in a browser and look for the info on the phalcon2 module.
  * - If you see it, you have been successful!
  *
  * Using PHP from the command line:
  * - Run `php -i "(command-line 'phpinfo()')"`
  * - Look for the info on the phalcon2 module.
  * - If you see it, you have been successful!
==> Summary
🍺  /usr/local/Cellar/php56-phalcon2/2.0.13: 5 files, 3.4MB, built in 1 minute 9 seconds

phalcon2已经成功安装了。

好了,执行php -v:

$ php -v
PHP 5.6.33 (cli) (built: Jan  7 2018 11:14:18) 
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

切到PHP7:

$ brew unlink php56
$ brew link php72
$ php -v
PHP 7.2.0 (cli) (built: Dec  3 2017 21:46:44) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2017 Zend Technologies

也就是需要的时候,只要使用brew的unlink和link命令在不同的php版本间切换即可。方便多了吧?!

Python

Homebrew中的python2和python3并无冲突,也就是可以执行$ brew install python2 python3就可以同时安装这两个版本。而且python2有virtualenv;python3有pyvenv,都可以用来维护虚拟运行环境。但是python2如果要使用ipython或者pythonw就会出现错误,会提示找不到Framework。好在我们还有另一个选择,那就是pyenv

首先我们安装pyenv,用homebrew就可以了:

$ brew install pyenv

然后初始化一下pyenv的运行环境参数,其实也就是在你的.bash_profile中做了些配置,执行$ pyenv init就可以了。

查看可用的python版本:

$ pyenv install --list

安装你需要的python版本,比如2.7.14、3.6.3,注意安装之后(或者pip安装了带有可执行命令的包之后)要执行rehash:

$ pyenv install 2.7.14
$ pyenv install 3.6.3
$ pyenv rehash

需要注意的是,如果需要支持Framework,要加上–enable-framework参数:

$ env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 2.7.14

设置python的版本,可以设置全局global,也可以使用local设置当前目录的:

$ pyenv global 3.6.3
$ pyenv local 2.7.14

pyenv version 查看当前的python版本,pyenv versions列出系统已安装的的python版本。更多的pyenv命令和配置可以参考:

还是很简单方便的是吧!

Ruby

对于这货,其实只要安装了RVM就OK了!

Devy

独立开发者' 全栈' 80前' 在理想与现实之间寻找平衡'

Read More