最近在Mac 上做开发,起初在搭建环境时 遇到了部分问题,加上Mac 预装的那个PHP 版本,实在是不好用,php-fpm
总是启不动,最后索性决定在本地自己装个多版本,可以随时自由切换。
是否需要清除旧版本?
因为需要在Mac 上安装其他版本,所以预装的那个版本的PHP 的存在就没啥意义了。
考虑到本机的其他软件可能会依赖它,为了给以后省些事,最后还是决定将预装的版本给移除掉。
事实证明移除了也没关系。
移除旧版本
这里说的旧版本指的是Mac 自带的PHP版本。
1 | # /private/etc/ |
执行完上面这些命令就能将旧版本的PHP 彻底的从你的Mac 上移除了。
安装多版本
直到2018年3月底,所有PHP 相关的brew 都由 homebrew/php
tab 处理,但是已经弃用了,所以现在我们使用homebrew/core
包中的可用的内容。这应该是一个更好维护但是不太完整的包。
由于PHP5.6
和PHP7.0
在 Homebrew 上已被弃用,因为以不被支持,虽然不建议在生产环境中使用,但还是可以在开发环境中使用这些不受支持的版本,可以参考:PHP支持的版本。
请记住,Homebrew 正式支持PHP7.1 到 7.3 ,因此如果要安装 PHP5.6或PHP7.0,则需要执行如下命令:
1 | $ brew tap shivammathur/php |
接下来正式开始安装PHP 的各种版本,并使用简单的脚本来进行版本之间的切换。
1 | $ brew install shivammathur/php/php@5.6 |
第一个安装所花费的时间长一些,因为需要安装一堆brew 的依赖,随后其他版本的安装的将很快。
所安装各版本的PHP都在该目录下:
1 | $ ls /usr/local/etc/php |
安装完以上版本的PHP 之后,执行:
1 | $ php -v |
可以看到目前所使用的PHP 版本是7.3(最后安装完的那个),现在试图切换到第一个安装的PHP 版本:
1 | $ brew unlink php@7.3 && brew link --force --overwrite php@5.6 |
unlick
安装PHP 版本之间不再需要联系,因为默认情况下他们是没有符号链接。
再次查看当前版本:
1 | $ php -v |
切换的挺顺利的,但如果每次需要切换时都需要这样输入就变得很麻烦了,幸运的是,一些勤劳的人已经为我们完成了艰苦的工作,并编写了一个非常方便的脚本——PHP切换器脚本。
将sphp
脚本安装到 brew 的标准中/usr/local/bin
:
1 | $ curl -L https://gist.githubusercontent.com/rhukster/f4c04f1bf59e0b74e335ee5d186a98e2/raw > /usr/local/bin/sphp |
多版本切换
完成这些步骤后,就能够使用脚本命令切换PHP版本:
1 | $ sphp 7.2 |
使用时会需要提供管理员密码,相比长长的命令这已经省事很多了。
好了,到这里就顺利的完成了多版本的PHP 安装以及切换。
管理 PHP 服务
在不需要切换版本时,使用brew services
命令可以对该版本的PHP 进行管理:
启动/停止/重启 PHP服务:
1 | $ brew services start/stop/restart php |
当PHP 服务启动时,通过查看进程列表,可以发现多了几个名为php-fpm
的进程。
php-fpm
的进程所在目录:/usr/local/opt/php/sbin/php-fpm
这个进程很重要,在与 Nginx 交互时,如果没有启动它,通常会收到 502 Bad Gateway
的错误。
尽管不需要刻意的去管理这个进程,但如果这个进程意外停止运行了,还是要知道该如何启动它。
前台启动
1 | $ cd /usr/local/opt/php/sbin/ |
用这种方式启动,当使用⌃ C
退出时,进程也会跟着退出。
后台启动
1 | # /usr/local/opt/php/sbin/ |
如果用这种方式启动,就算退出了当前会话,进程会以守护进程的方式运行着。
检查PHP 版本
最后再啰嗦两句,如果需要把当前5.6版本切换成7.2,那么需要分别做两件事:
1 | # 第一步 |
如果只做了第一步,那么你会发现 php -v
的版本输出的确是 7.2,但php_info()
所打印的结果却还是 5.6。
这是因为机器上安装了多个PHP 版本,当使用php -v
命令时,它将显示默认PHP CLI
的版本,而该版本可能不是网站所使用的版本。
所以找出用于特定网站的PHP 版本的最可靠方法是使用phpinfo()
函数。
php cli
可以正常访问,但是Web 服务却没有办法访问,这是因为安装了PHP,所以可以通过命令行直接访问,但是 php-fpm
却没有启动,所以Web 服务没法正常访问。
启动Web 服务:
1 | cd /usr/local/Cellar/php/8.1.1/sbin |
sphp 这个脚本所做的事情等于以下命令:
1 | brew unlink php@7.3 && brew link --force --overwrite php@5.6 |
只是改变了命令行的版本,Web 服务最终还是要以允许的php-fpm
为准。