mac环境随时随地方便的切换php版本,前提如下:

  • Mac 环境, zsh为默认shell
  • 安装了brew
  • 通过brew 安装了多个版本的php

基本方式

举例,从php.7.4切换到php8.1

brew unlink php7.4 && brew link --overwrite --force php@8.1

到这一步,如果运行 php -v ,那么版本还是7.4 ,因为还需手动更新.zshrc文件中的PATH路径,以确保使用正确的PHP版本。

vim ~/.zshrc

#注释掉下面两行
export PATH="/usr/local/opt/php@7.4/bin:$PATH"
export PATH="/usr/local/opt/php@7.4/sbin:$PATH"

#手动添加如下两行
export PATH="/usr/local/opt/php@8.1/bin:$PATH"
export PATH="/usr/local/opt/php@8.1/sbin:$PATH"

#保存后运行下面命令之使生效
source ~/.zshrc

改进方式

将上面提到的命令写成bash脚本,一次运行。


#!/bin/zsh
if [ "$1" = "7.4" ]; then
    brew unlink php@8.1 && brew link --overwrite --force php@7.4
    sed -i '' '/php@[0-9\.]*\//d' ~/.zshrc
    echo 'export PATH="/usr/local/opt/php@7.4/bin:$PATH"' >> ~/.zshrc
    echo 'export PATH="/usr/local/opt/php@7.4/sbin:$PATH"' >> ~/.zshrc
elif [ "$1" = "8.1" ]; then
    brew unlink php@7.4 && brew link --overwrite --force php@8.1
    sed -i '' '/php@[0-9\.]*\//d' ~/.zshrc
    echo 'export PATH="/usr/local/opt/php@8.1/bin:$PATH"' >> ~/.zshrc
    echo 'export PATH="/usr/local/opt/php@8.1/sbin:$PATH"' >> ~/.zshrc
else
    echo "Invalid argument. Please enter either '7.4' or '8.1'."
    exit 1
fi

source ~/.zshrc

文件需要保存为.zsh后缀,首行声明 #!/bin/zsh , 否则会报错:Oh My Zsh can’t be loaded from: sh. You need to run zsh instead. 因为脚本在Bash中运行,而不是在zsh中运行。解决办法是将脚本转换为zsh脚本,将脚本的文件扩展名从.sh更改为.zsh,然后在脚本的开头添加以下行:#!/usr/bin/env zsh; 或者脚本的开头添加以下行:#!/bin/zsh

然后运行下面的命令执行:


./switch-php.zsh 7.4
#OR
./switch-php.zsh 8.1

然而,脚本中的最后一行似乎没有生效。原因是在脚本中执行source ~/.zshrc,则会在子shell中运行,该子shell无法影响父shell的环境。因此,即使在脚本中添加了该行,也不会影响当前的终端会话。

为了解决这个问题,可以将脚本转换为函数,并将其添加到您的.zshrc文件中。这样,每次打开终端时,都会将该函数加载到终端会话中,并且可以在当前终端会话中直接调用该函数来切换PHP版本。

因为脚本会更改 .zshrc 文件自身,为了防止函数本身被修改,我们将函数放在另一个文件中,然后从.zshrc中引入。

新建文件custom.zsh

#!/bin/zsh
function switch-php() {
if [ "$1" = "7.4" ]; then

    brew unlink php@8.1 && brew link --overwrite --force php@7.4
    sed -i '' '/php@[0-9\.]*\//d' ~/.zshrc
    echo 'export PATH="/usr/local/opt/php@7.4/bin:$PATH"' >> ~/.zshrc
    echo 'export PATH="/usr/local/opt/php@7.4/sbin:$PATH"' >> ~/.zshrc
elif [ "$1" = "8.1" ]; then
    brew unlink php@7.4 && brew link --overwrite --force php@8.1
    sed -i '' '/php@[0-9\.]*\//d' ~/.zshrc
    echo 'export PATH="/usr/local/opt/php@8.1/bin:$PATH"' >> ~/.zshrc
    echo 'export PATH="/usr/local/opt/php@8.1/sbin:$PATH"' >> ~/.zshrc
else
    echo "Invalid argument. Please enter either '7.4' or '8.1'."
    exit 1
fi

source ~/.zshrc

然后在在.zshrc 尾部加入一行,引入该文件

source ~/custom.zsh

保存后执行 source ~/.zshrc. 使修改生效,然后就可以随时随地一条命令切换php版本了

switch-php 7.4
#or
switch-php 8.1