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

在设置Ubuntu 16.04 vhost时,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 

但是,这打破了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 

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

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

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

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

描述

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

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

当您第一次安装PHP时,您使用以下方法安装:

 sudo apt install php 

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

  $ apt show 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
支持:5y
下载大小:2,832 B
 APT-Manual-Installed:是的
 APT资料来源:http://archive.ubuntu.com/ubuntu xenial / main amd64软件包
 描述:服务器端,HTML嵌入式脚本语言(默认) 
   PHP(PHP的递归首字母缩略词:Hypertext Preprocessor)是一种广泛使用的 
   开源通用脚本语言,特别适合 
   用于Web开发,可以嵌入到HTML中。 
    
   这个包是一个依赖包,它取决于Debian的默认值 
   PHP版本(目前为7.0)。 

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

Ondrej的PHP PPA提供了多个可以并排安装的PHP版本。 因此,当你添加它的系统时, apt发现了一个较新版本的PHP,所以它用php7.0替换了php7.0 *以及任何自动安装的相关软件包。

回答

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

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

     sudo apt install ppa-purge sudo ppa-purge ppa:ondrej/php 
  2. Ondrej的PPA提供多个版本的PHP,因此您可以相互安装多个版本。 但是你只能启用php7.0 Apache模块。

     sudo apt install php7.0 libapache2-mod-php7.0 sudo a2dismod php7.1 sudo a2enmod php7.0 sudo apache2ctl restart 

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

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

通过在packages.ubuntu.com上搜索文件libphp7.0 ,我找到了两个包含该文件的包。 是否安装了? libapache2-mod-php7.0和/或libphp7.0-embed

libapache2-mod-php7.0重新安装libapache2-mod-php7.0

 sudo apt install --reinstall libapache2-mod-php7.0 

然后看看包中有什么要读的。 列出内容

 dpkg -L libapache2-mod-php7.0 

搜索结果:

  » Ubuntu » Packages » Package Contents Search Results Search for libphp7.0.so within filenames Search for paths ending with libphp7.0.so Search in other suite: [trusty] [xenial] [yakkety] [zesty] [artful] Limit search to a specific architecture: [amd64] [arm64] [armhf] [i386] [powerpc] [ppc64el] [s390x] You have searched for files named libphp7.0.so in suite yakkety, all sections, and all architectures. Found 2 results. File Packages /usr/lib/apache2/modules/libphp7.0.so libapache2-mod-php7.0 /usr/lib/libphp7.0.so libphp7.0-embed