如何在 Ubuntu 上拥有多个版本的 PHP

有许多工具,如 Docker、Vagrant、VirtualBox 等,可以让您在系统中实现多个版本的 PHP。但我想尽可能远离第三方工具,并尽可能多地利用原生工具。

那么想学习如何在Ubuntu系统上安装多个版本的PHP?好的,那太好了。

让我们假设,你有

  • 操作系统:Ubuntu 16.04
  • PHP:7.1(PHP-FPM)
  • Nginx:1.10

并想安装

PHP 7.2

安装 PHP 7.2

运行以下命令来更新 PHP 存储库和 Ubuntu 系统

sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt update

现在您可以安装新版本的 PHP

sudo apt install -y php7.2-fpm
sudo apt install -y php7.2-dev
php -v

如果

php -v

仍然指向旧的PHP版本,然后运行以下命令

sudo update-alternatives --set php /usr/bin/php7.2

安装 PHP 7.2 模块

您可能需要一些额外的 PHP 模块才能使 PHP 与您的应用程序一起工作。

您可以安装 Magento 2 尤其需要的最常用的模块:

sudo apt install php7.2-mysql php7.2-bcmath php7.2-curl php7.2-xml php7.2-gd php7.2-intl php7.2-mcrypt php7.2-mbstring php7.2-soap php7.2-zip

检查已安装的 PHP 模块:

php -m | grep -E 'bcmath|ctype|curl|dom|gd|hash|iconv|intl|json|mbstring|mcrypt|openssl|pdo|soap|spl|xml|xsl|zip'

要搜索 PHP 模块:

sudo apt-cache search php7.2

现在,您已经安装了新的 PHP 7.2 版本和所需的模块。同样,您可以安装 PHP 7.3、7.4、8.0 等及其相关模块。

现在一个大问题是:如何根据应用程序使用特定的 PHP 版本?

在此之前,我们应该知道 PHP 是如何使用的。

PHP 可以用作 CLI 或 Web 服务器模块(mod_php、CGI、FPM)。

切换 PHP CLI 版本

PHP的

php

命令链接到

/usr/bin/php

, 符号链接到

/etc/alternatives/php

,它再次符号链接到实际的 PHP,例如

/usr/bin/php7.2

所以这就是切换 PHP CLI 版本的逻辑。

默认情况下,PHP 安装会将 CLI 版本更改为新版本。

如果你想切换到特定版本,比如 PHP 7.2,你可以使用

update-alternatives

命令

sudo update-alternatives --set php /usr/bin/php7.2
php -v

您可以使用以下命令找到 PHP 可执行文件列表

ll /usr/bin | grep php

您可能需要运行

update-alternatives

如果您正在运行“composer”命令或任何 CLI PHP 脚本,则设置所需的 PHP 版本。

切换 PHP Web 服务器版本

你可能知道,Nginx 通过 PHP-FPM 运行 PHP 代码,它侦听 Unix 套接字。

这使得在 Nginx 的服务器块中切换 PHP 版本变得更加容易。

如果你想指向任何应用程序,比如 Magento 2 在 Nginx 上运行 PHP 7.2,你可以简单地改变值

fastcgi_pass

指令为:

您可以使用以下命令找到 PHP 可执行文件列表

fastcgi_pass unix:/run/php/php7.2-fpm.sock

查找 PHP-FPM 的 Unix 套接字列表

ll /run/php | grep sock

为了验证 Web SAPI 的 PHP 版本,您可以使用

phpinfo()

在您的 .php 文件中。

结论

有些人可能想为此使用 Docker,基于 Vagrant 的解决方案。没关系。

对我来说,我总是更喜欢原生系统,而不依赖第三方解决方案。这最大限度地减少了开销和延迟问题,从而使应用程序开发更容易和更快。

在您阅读的上面,您可以轻松地更改 PHP CLI 和 Web SAPI 版本。对于基于 CLI,您可能必须运行

update-alternatives

按需命令。但是对于 Web 应用程序,一旦设置了所需的 PHP 版本,它们将在特定的 PHP 版本上独立工作。

how-to-have-multiple-versions-of-php-on-ubuntu-sa1635d2