Kang's Blog

Kang's Blog

14 May 2022

如何使用 Homebrew 在 macOS 中切换 PHP 版本

TLDR

安装不同版本的 PHP

# php version in [7.2, 7.3, 7.4, 8.0, 8.1]
brew install php@7.4
# or use shivammathur/homebrew-php tap
brew install shivammathur/php/php@7.4

# php version in [5.6, 7.0, 7.1]
# only can use shivammathur/homebrew-php tap
brew install shivammathur/php/php@7.1

切换版本

brew unlink php@7.4
brew link php@7.1

起因

为了追查 Laravel 5.8 的一个 RCE 漏洞,我需要在本机复现。当我安装完 Laravel 5.8 后,执行 composer install 安装依赖却没成功:

$ composer install
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Root composer.json requires php ^7.1.3 but your php version (8.1.5) does not satisfy that requirement.
  Problem 2
    - laravel/framework[v5.8.0, ..., 5.8.x-dev] require php ^7.1.3 -> your php version (8.1.5) does not satisfy that requirement.
    - Root composer.json requires laravel/framework 5.8.* -> satisfiable by laravel/framework[v5.8.0, ..., 5.8.x-dev].

Laravel 5.8 最高支持的 PHP 版本为 7.1。所以我得降版本。

在工作中,也会遇到类似的问题:追踪以前的代码时有些场景可能需要安装依赖,但版本并不匹配,之前都是跳过,寻找别的解决方案。正好借此机会总结一下。

解决

search 一下发现 Homebrew core 只维护了 php@7.2 以上的版本:

$ brew search --formula php
==> Formulae
brew-php-switcher      php-cs-fixer           php@7.3                phpbrew                phpmyadmin             pcp
php ✔                  php-cs-fixer@2         php@7.4                phplint                phpstan                pup
php-code-sniffer       php@7.2                php@8.0 ✔              phpmd                  phpunit

从上面的结果中发现了 phpbrew。它安装完后还需要设置环境变量,有点麻烦,并且最近一次提交在 2021/1/31 就觉得不太靠谱,放弃。

通过搜索找到了 Valet,它是 Laravel 团队开发的在 Mac 上快速搭建 PHP 开发环境的工具。

代码中可以看到,它通过 shivammathur/homebrew-php tap 来安装 Homebrew core 没有维护的 PHP 版本。其中就包含了我想要的 php@7.1:

brew install shivammathur/php/php@7.1

安装完成后,使用 Homebrew 中的 link/unlink ,将 PHP 版本设置为 7.1:

brew unlink php
brew link php@7.1

最后愉快的在 Laravel 5.8 中 composer install

Ref