如何让 Apache 使用 PHP 7.0(不是 7.1)?

Fre*_*cal 7 php apache2 16.04

设置 Ubuntu 16.04 虚拟主机时,Apache 将使用 PHP 7.0.22-2+ubuntu16.04.1+deb.sury.org+4

但是,在尝试通过执行apt-get dist-upgrade(并且失败)来解决一些冲突之后,我最终得到了一个严重损坏的系统。我已经设法将大多数软件包版本回滚到默认版本,但 Apache 使用 PHP 7.1.8-2+ubuntu16.04.1+deb.sury.org+4,这与我需要的一些 PHP 库不兼容。

到目前为止,我已经尝试过:

sudo a2dismod php7.1
sudo a2enmod php7.0
sudo service apache2 restart
Run Code Online (Sandbox Code Playgroud)

但是,这会破坏 Apache 并拒绝重新启动:

Syntax error on line 140 of /etc/apache2/apache2.conf: Syntax error on line 3 of /etc/apache2/mods-enabled/php7.0.load: Cannot load /usr/lib/apache2/modules/libphp7.0.so
Run Code Online (Sandbox Code Playgroud)

如何让 Apache 再次运行默认的 PHP 版本 (PHP 7.0)?

编辑Dan下面对我的 [现已编辑] 自我回答的评论 让我意识到添加以下第三方 PPAppa:ondrej/php可能与问题有关。

所以:
我已将 PPA 添加ppa:ondrej/php到我的网站。

Dan*_*Dan 10

我将把我的答案分成两部分。第一部分描述您的问题是如何发生的,第二部分是您问题的实际答案。

描述

免责声明:我的大部分描述基本上都是猜测,因为我真的不知道你做了什么。但这是最有可能的情况,因为我想不出另一种最终会为您提供所描述问题的方法。

从您描述的问题来看,您似乎安装了第三方 PPA,该 PPA 在您的系统上安装了 PHP 7.1。最有可能的 PPA 是Ondrej 的 PPA

当您第一次安装 PHP 时,您是通过以下方法安装的:

sudo apt install php
Run Code Online (Sandbox Code Playgroud)

php包只是一个元包,不包含所需的二进制文件。这取决于可用 PHP 包的最新版本(默认为 7.0)。因此,当您安装它时,该php7.0软件包与php7.0的依赖项(libapache2-mod-php7.0 如果有apache2)一起安装,并且所有这些依赖项在软件包管理器中都标记为“自动安装”。

$ apt 显示 php
包: php
版本:1:7.0+35ubuntu6
优先级:可选
部分: php
来源:php-defaults (35ubuntu6)
产地:Ubuntu
维护者:Ubuntu 开发者 
原始维护者:Debian PHP 维护者 
错误:https://bugs.launchpad.net/ubuntu/+filebug
安装大小:11.3 kB
取决于:php7.0
支持:5年
下载大小:2,832 B
APT-手动安装:是
APT 来源:http://archive.ubuntu.com/ubuntu xenial/main amd64 包
描述:服务器端,嵌入 HTML 的脚本语言(默认)
 PHP(PHP 的递归首字母缩写词:超文本预处理器)是一种广泛使用的
 特别适合的开源通用脚本语言
 用于 Web 开发,并且可以嵌入到 HTML 中。
 .
 这个包是一个依赖包,依赖于Debian的默认
 PHP 版本(目前为 7.0)。

我将命令结果的部分加粗,这解释了我刚才提到的内容。

Ondrej 的 PHP PPA 提供了多个可以相互安装的 PHP 版本。因此,当您将它添加到您的系统时,apt发现了一个更新版本的 PHP,因此它替换了php7.0*php7.1以及自动安装的任何相关软件包。

回答

有两种方法可以解决您的问题。

  1. 完全删除第 3 方 PPA,并恢复到默认的 PHP 包

    sudo apt install ppa-purge
    sudo ppa-purge ppa:ondrej/php
    
    Run Code Online (Sandbox Code Playgroud)
  2. Ondrej 的 PPA 提供多个版本的 PHP,因此您可以同时安装多个版本。但是您将只启用php7.0Apache 模块。

    sudo apt install php7.0 libapache2-mod-php7.0
    sudo a2dismod php7.1
    sudo a2enmod php7.0
    sudo apache2ctl restart
    
    Run Code Online (Sandbox Code Playgroud)

    以以前的方式安装它们会将php7.0软件包设置为“手动安装” apt,因此如果您不自行删除它们,它们将不会被自动删除。 不要忘记确保安装 php7.0 所需的任何 PHP 模块(如sudo apt install php7.0-mysql

*php7.0如果您手动安装了专门用于 php7.0 的模块(例如php7.0-mysql),则可能已安装在您的系统中。