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

如何让 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)?

编辑:下面是我对我的自我回答的评论(现已删除), 让我意识到添加以下第三方 PPAppa:ondrej/php可能与该问题有关。

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

答案1

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

描述

免责声明:我的大部分描述基本上都是推测,因为我无法真正知道你做了什么。但这是最有可能的情况,因为我无法想到其他可能导致你所描述的问题的方法。

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

首次安装PHP时,按照以下方式安装:

sudo apt install php

php包只是一个元包,不包含所需的二进制文件。它依赖于可用 PHP 包的最新版本(默认为 7.0)。因此,当您安装它时,包会与的依赖项php7.0一起安装(如果您有),并且所有这些依赖项在包管理器中都标记为“自动安装”。php7.0libapache2-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. 完全删除第三方 PPA,并恢复为默认 PHP 包

    sudo apt install ppa-purge
    sudo ppa-purge ppa:ondrej/php
    
  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
    

    以以前的方式安装它们会将php7.0包设置为“手动安装” apt,因此除非您亲自删除它们,否则它们不会被自动删除。 不要忘记安装 php7.0 所需的所有 PHP 模块(例如sudo apt install php7.0-mysql

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

答案2

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

重新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

相关内容