安装多个PHP版本,并为每个目录自动切换版本
#php #ubuntu #mac #phpenv

描述

  • Qiita翻译
  • 我想使用多个版本的PHP
  • 我想自动在每个目录的不同版本的PHP之间切换
  • 我不想做PHP,因为它们太难了
  • 我想支持Mac和Ubuntu

安装啤酒

  • 安装Brew
  • 我认为Brew仅适用于Mac,但也可以安装在Ubuntu上!

安装PHP

  • 安装php
  • 可以根据需要安装其他软件包,例如ImageMagick
  • 在本文中, * php与Brew一起安装。 *
brew update
brew tap shivammathur/php
brew install php@8.1
brew install php@8.0
brew install php@7.4
brew install pkg-config
brew install imagemagick

安装phpenv

  • 安装phpenv
  • PHPENV用于使用phpenv globalphpenv local等在PHP版本之间进行切换。
  • 在本文中, PHPENV不安装PHP
# Install phpenv
curl -L https://raw.githubusercontent.com/phpenv/phpenv-installer/master/bin/phpenv-installer | bash

# Setup phpenv
$(cat << 'EOF' >> ~/.zshrc
# phpenv
export PHPENV_ROOT="$HOME/.phpenv"
if [ -d "${PHPENV_ROOT}" ]; then
  export PATH="${PHPENV_ROOT}/bin:${PATH}"
  eval "$(phpenv init -)"
fi
EOF
)

# restart shell
exec $SHELL -l

链接BREW安装的每个版本的PHP与〜/.phpenv/版本

  • 您需要链接Brew安装的PHP,以便PHPENV可以管理它们。手动工作很乏味,所以I wrote a script.
curl -fsSL https://gist.githubusercontent.com/yuki777/6244823b8aa8cf4457e97e6407ada5ad/raw/e988f8a1c112e4063768664104ba14d799e63782/link-phps.bash | bash

来源

#!/usr/bin/env bash

set -au

## Check cellar dir
cellarDir=$(brew --prefix)/Cellar
if [ ! -d "$cellarDir" ]; then
  echo "Not found. brew package path $cellarDir :("
  echo
  exit 1
fi

parentDirs=$(find $cellarDir/php* -type d -maxdepth 0)
echo "# Link the php installed by Brew to ~/.phpenv/versions"
for parentDir in $parentDirs
do
  childDirs=$(find "$parentDir"/* -type d -maxdepth 0)
  for childDir in $childDirs
  do
    phpPath=$childDir/bin/php
    if [ ! -f "$phpPath" ]; then
      continue
    fi
    major=$($phpPath -r 'echo PHP_MAJOR_VERSION;')
    minor=$($phpPath -r 'echo PHP_MINOR_VERSION;')
    patch=$($phpPath -r 'echo PHP_RELEASE_VERSION;')

    # unlink
    rm -f "$HOME"/.phpenv/versions/"$major"."$minor"
    rm -f "$HOME"/.phpenv/versions/"$major"."$minor"."$patch"

    # link
    linkCommand="ln -s $childDir $HOME/.phpenv/versions/$major.$minor"
    echo "$linkCommand"
    $linkCommand
    linkCommand="ln -s $childDir $HOME/.phpenv/versions/$major.$minor.$patch"
    echo "$linkCommand"
    $linkCommand
  done
done

测试

  • 测试Global中运行php -v将使用PHP 8.1
  • 测试当您移至/TMP/PHP7.4时,将自动切换到PHP 7.4
cd /tmp && mkdir php74 php80 php81

# set version
cd /tmp         && phpenv global 8.1 # set 8.1 as a global
cd /tmp/php74   && phpenv local  7.4 # pin 7.4 in this dir
cd /tmp/php80   && phpenv local  8.0 # pin 8.0 in this dir
cd /tmp/php81   && phpenv local  8.1 # pin 8.1 in this dir

# test version
cd /tmp         && php -v # => 8.1
cd /tmp/php74   && php -v # => 7.4
cd /tmp/php80   && php -v # => 8.0
cd /tmp/php81   && php -v # => 8.1

关于酿造升级的注释

  • 当PHP通过BREW升级升级时,Symlink将被打破,因此您需要重新运行该链接。
curl -fsSL https://gist.githubusercontent.com/yuki777/6244823b8aa8cf4457e97e6407ada5ad/raw/e988f8a1c112e4063768664104ba14d799e63782/link-phps.bash | bash

概括

  • 想要与phpenv一起使用多个版本的php =>。
  • 想要在每个目录的不同版本的php之间自动切换使用phpenv。
  • 不想用php builds =>用酿造安装php浪费时间。
  • 我想支持Mac和ubuntu =>用Brew和我自己的脚本支持。
  • 特别感谢,Uzulla-San的slide11

和别的

  • 关于PECL安装
  • 本文假设安装干净,但是在某些情况下,PHP,Direnv,Brew-PHP-Switcher等已经安装。
  • 关于在VSCODE和PHPSTORM中指定PHP版本
  • 如果有需求,我会写更多。