Boo's Blog

Stay foolish, Stay hungry

最近在Mac 上做开发,起初在搭建环境时 遇到了部分问题,加上Mac 预装的那个PHP 版本,实在是不好用,php-fpm 总是启不动,最后索性决定在本地自己装个多版本,可以随时自由切换。

是否需要清除旧版本?

因为需要在Mac 上安装其他版本,所以预装的那个版本的PHP 的存在就没啥意义了。
考虑到本机的其他软件可能会依赖它,为了给以后省些事,最后还是决定将预装的版本给移除掉。

事实证明移除了也没关系。

移除旧版本

这里说的旧版本指的是Mac 自带的PHP版本。

1
2
3
4
5
6
7
8
9
10
11
12
# /private/etc/
$ sudo rm -rfi php-fpm.conf.default php-fpm.conf php.ini.default php-fpm.d/
# /usr/bin/
$ sudo rm -rfi php php-config phpize
# /usr/lib/
$ sudo rm -rf php/
# /usr/sbin/
$ sudo rm -rf php-fpm
# /usr/share/
$ sudo rm -rf php
# /usr/share/man/man1/
$ sudo rm -rf php-config.1 php.1 phpize.1

执行完上面这些命令就能将旧版本的PHP 彻底的从你的Mac 上移除了。

安装多版本

直到2018年3月底,所有PHP 相关的brew 都由 homebrew/php tab 处理,但是已经弃用了,所以现在我们使用homebrew/core包中的可用的内容。这应该是一个更好维护但是不太完整的包。

由于PHP5.6PHP7.0在 Homebrew 上已被弃用,因为以不被支持,虽然不建议在生产环境中使用,但还是可以在开发环境中使用这些不受支持的版本,可以参考:PHP支持的版本

请记住,Homebrew 正式支持PHP7.1 到 7.3 ,因此如果要安装 PHP5.6或PHP7.0,则需要执行如下命令:

1
2
3
4
5
$ brew tap shivammathur/php
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
……

接下来正式开始安装PHP 的各种版本,并使用简单的脚本来进行版本之间的切换。

1
2
3
4
5
$ brew install shivammathur/php/php@5.6
$ brew install shivammathur/php/php@7.0
$ brew install shivammathur/php/php@7.1
$ brew install shivammathur/php/php@7.2
$ brew install shivammathur/php/php@7.3

第一个安装所花费的时间长一些,因为需要安装一堆brew 的依赖,随后其他版本的安装的将很快。

所安装各版本的PHP都在该目录下:

1
2
3
4
5
$ ls /usr/local/etc/php
5.6 7.0 7.1 7.2 7.3

# php.ini 配置文件目录
/usr/local/etc/php/x.x/php.ini

安装完以上版本的PHP 之后,执行:

1
2
3
4
5
$ php -v 
PHP 7.3.5 (cli) (built: May 2 2019 12:40:36) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.5, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.3.5, Copyright (c) 1999-2018, by Zend Technologies

可以看到目前所使用的PHP 版本是7.3(最后安装完的那个),现在试图切换到第一个安装的PHP 版本:

1
$ brew unlink php@7.3 && brew link --force --overwrite php@5.6

unlick 安装PHP 版本之间不再需要联系,因为默认情况下他们是没有符号链接。

再次查看当前版本:

1
2
3
4
5
$ php -v
PHP 5.6.40 (cli) (built: Apr 23 2019 11:14:34)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies

切换的挺顺利的,但如果每次需要切换时都需要这样输入就变得很麻烦了,幸运的是,一些勤劳的人已经为我们完成了艰苦的工作,并编写了一个非常方便的脚本——PHP切换器脚本

sphp脚本安装到 brew 的标准中/usr/local/bin

1
2
$ curl -L https://gist.githubusercontent.com/rhukster/f4c04f1bf59e0b74e335ee5d186a98e2/raw > /usr/local/bin/sphp
$ chmod +x /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
2
$ cd /usr/local/opt/php/sbin/
$ ./php-fpm

用这种方式启动,当使用⌃ C退出时,进程也会跟着退出。

后台启动

1
2
# /usr/local/opt/php/sbin/
$ ./php-fpm &

如果用这种方式启动,就算退出了当前会话,进程会以守护进程的方式运行着。

检查PHP 版本

最后再啰嗦两句,如果需要把当前5.6版本切换成7.2,那么需要分别做两件事:

1
2
3
4
5
6
# 第一步
$ sphp 7.2

# 第二步
$ brew services stop php@5.6
$ brew services start php@7.2

如果只做了第一步,那么你会发现 php -v的版本输出的确是 7.2,但php_info()所打印的结果却还是 5.6。

这是因为机器上安装了多个PHP 版本,当使用php -v命令时,它将显示默认PHP CLI的版本,而该版本可能不是网站所使用的版本。

所以找出用于特定网站的PHP 版本的最可靠方法是使用phpinfo()函数。


php cli 可以正常访问,但是Web 服务却没有办法访问,这是因为安装了PHP,所以可以通过命令行直接访问,但是 php-fpm 却没有启动,所以Web 服务没法正常访问。

启动Web 服务:

1
2
cd /usr/local/Cellar/php/8.1.1/sbin
./php-fpm

sphp 这个脚本所做的事情等于以下命令:

1
$ brew unlink php@7.3 && brew link --force --overwrite php@5.6

只是改变了命令行的版本,Web 服务最终还是要以允许的php-fpm 为准。

参考链接

本来之前就知道有 tmux 这样一个窗口分隔工具,只不过一直使用着iTerm2,本身就自带有标签页功能,所以就一直没去学习这个工具。

这段时间需要经常访问Linux服务器,所以在服务器上安装了这个工具。

安装

Mac:

1
brew install tmux

Linux:

1
apt-get install tmux

一般情况下 tmux 中所有的快捷键都需要和前缀快捷键 ⌃b 来组合使用(注:⌃ 为 Mac 的 control 键),以下是常用的窗格(pane)快捷键列表。

会话

第一次使用tmux 可能会被Session窗口窗格 这些陌生的概念,弄得摸不着头脑。

这里总结成一句话就是:
一个完整的会话(Session)是由数个窗口组成,而一个窗口又可以分成若各个窗格。

使用tmux 命令会默认新建一个tmux 会话:

1
2
// 默认新建一个Session 名称为 0 的窗口。
tmux

常用Session操作:

  • $ 重命名当前会话
  • s 选择会话列表
  • d 退出当前会话(不是删除),运行后将会退出 tmux 进程,返回至 shell 主进程。

窗口

窗口的概念不同于窗格,窗口互不影响,窗格相互分隔。

常用窗口操作:

  • c 新建窗口,此时当前窗口会切换至新窗口,不影响原有窗口的状态
  • p 切换至上一窗口
  • n 切换至下一窗口
  • w 窗口列表选择,注意 macOS 下使用 ⌃p 和 ⌃n 进行上下选择
  • & 关闭当前窗口
  • , 重命名窗口,可以使用中文,重命名后能在 tmux 状态栏更快速的识别窗口 id
  • 0 切换至 0 号窗口,使用其他数字 id 切换至对应窗口
  • f 根据窗口名搜索选择窗口,可模糊匹配

窗格

窗格是在窗口下的概念,若干个窗格组成一个窗口。

常用窗格操作:

  • % 左右平分出两个窗格
  • “ 上下平分出两个窗格
  • x 关闭当前窗格
  • { 当前窗格前移
  • } 当前窗格后移
  • ; 选择上次使用的窗格
  • o 选择下一个窗格,也可以使用上下左右方向键来选择
  • space 切换窗格布局,tmux 内置了五种窗格布局,也可以通过 ⌥1 至 ⌥5来切换
  • z 最大化当前窗格,再次执行可恢复原来大小
  • q 显示所有窗格的序号,在序号出现期间按下对应的数字,即可跳转至对应的窗格

其他命令

上面那些命令都是配合⌃ + b快捷键使用的,下面的这些命令都是在Shell进程中直接执行的。

新建名称为 foo 的会话

1
tmux new -s foo

列出所有 tmux 会话

1
tmux ls

恢复上一次会话

1
tmux a

恢复名为 foo 的会话

1
tmux a -t foo

删除名为 foo 的会话

1
tmux kill -session -t foo

删除所有会话

1
tmux kill -server

tmux or iterm2

tmuxiTerm2 都有窗口管理方面的功能,只是前者相比后者的优势在于:

  • iTerm2 的窗格切换快捷键(⌘⌥→)容易与其他软件全局快捷键冲突(例如 Spectacle 的窗口分割快捷键),tmux 由于存在前缀快捷键,所以不存在快捷键冲突问题;
  • tmux 可以在终端软件重启后通过命令行恢复上次的 session ,而终端软件则不行;
  • tmux 简洁优雅、订制性强,学会之后也能在 Linux 上使用,有助于逼格提升。

参考链接