如何在Ubuntu 16.04上将PHP 7降级到PHP 5.6?

我正在尝试将我的PHP版本从7回滚到5.6,虽然我已经移除了PHP 7并安装了PHP 5.6,但我似乎仍在运行版本7。
是否有一种简单的方法可以在apache、phpMyAdmin等配置适当的情况下切换PHP版本?
一种简单的方法是动态地更改当前的PHP版本,甚至可以按网站进行更改。

我似乎安装了5.6版本,但现在我的所有PHP代码都以文本形式呈现。 - dibs
dpkg -l | grep php | awk '{print $2}' | tr "\n" " " 命令的输出是什么? - storm
dh-php libapache2-mod-php5 php-common php-json php-pear php-xml php5-cli php5-common php5-json php5-readline php5.6 php5.6-bz2 php5.6-cli php5.6-common php5.6-curl php5.6-dev php5.6-fpm php5.6-gd php5.6-json php5.6-mcrypt php5.6-mysql php5.6-opcache php5.6-readline php7.0-common php7.0-json php7.0-xml pkg-php-tools - dibs
我看到那里有一些php7的软件包,请使用aptitude purge php7.0-common php7.0-json php7.0-xml将它们移除。另外,我想知道你所说的“我的所有php现在都以文本形式呈现”是什么意思。 - storm
我已经移除了php7的软件包,但页面仍然只显示文本。目前我似乎陷入了一个死循环。等我解决了这个问题后,我会更新这个页面。 - dibs
2иҝҷж„Ҹе‘ізқҖдҪ зјәе°‘libapache2-mod-php5.6иҪҜ件еҢ…...иҜ·зңӢдёӢйқўзҡ„еӣһзӯ”пјҢдҪ дёҚйңҖиҰҒ移йҷӨphp7.0гҖӮ - Postadelmaga
根据这个链接(https://askubuntu.com/a/306555/1516753),不推荐在较新的操作系统版本上安装旧版本的PHP,比如说,Ubuntu 16.04支持PHP 7+。 - variable
4个回答

更新 今天我再次遇到了PHP 7运行的问题,尽管我已经禁用了php7.0 apache模块:phpinfo显示使用fastCGI的php 7... ...所以,如果在按照下面的说明操作后,你遇到了这种情况,可能需要禁用proxy_fcgi apache模块。
sudo a2dismod proxy_fcgi proxy; sudo service apache2 restart

1. 重新安装 PHP 5.6
对我来说有效的方法是参考这篇指南:http://www.lornajane.net/posts/2016/php-7-0-and-5-6-on-ubuntu 实际上并不需要删除 php7.0,你可以同时安装 php5.6(因为你会在 phpmyadmin 包中遇到依赖问题,它需要 php7.0)
假设对你来说,libapache2-mod-php 是在 Apache 中启用 PHP 的合适方式,你可以按照以下步骤进行操作:
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get install php7.0 php5.6 php5.6-mysql php-gettext php5.6-mbstring php-mbstring php7.0-mbstring php-xdebug libapache2-mod-php5.6 libapache2-mod-php7.0

2. 切换 PHP 版本:

从php5.6升级到php7.0: Apache: sudo a2dismod php5.6 ; sudo a2enmod php7.0 ; sudo service apache2 restart CLI: sudo update-alternatives --set php /usr/bin/php7.0
从php7.0降级到php5.6: Apache: sudo a2dismod php7.0 ; sudo a2enmod php5.6 ; sudo service apache2 restart CLI: sudo update-alternatives --set php /usr/bin/php5.6

我来试试看,但是切换版本的两个命令是不是每次都要禁用两个版本的PHP? - dibs
2你说得对,谢谢,我已经修复了命令 :) - Postadelmaga
这似乎是处理这个问题最简单的方法。我喜欢你可以在不同版本的PHP之间切换的功能。 - dibs
2@Postadelmaga 更改PHP版本对于Web应用程序是有效的。非常感谢!但是CLI仍然运行PHP7。你知道如何将其切换到PHP5.6吗? - John Linhart
1最好的方法是删除原始的php软件包,添加Ondrej ppa,然后安装php7和php5.6。记住你可以使用"phpenmod -v 5.6"来启用php5.6模块,使用"phpenmod -v 7.0"来启用php 7.0模块。更多信息请参考这里:https://disqus.com/home/discussion/serversforhackers/installing_php_7_with_memcached_servers_for_hackers/#comment-2590380342 - razor7
谢谢你的回答,但是从5.6升级到7.0似乎没有起作用,因为当我重启Apache后运行php -v时,它仍然显示5.6.21。 - toesslab
7这篇帖子真是救了我的一天。 - Shoaib Nawaz
1@Daenu,这是因为php -v命令会显示PHP的命令行界面版本...建议的命令适用于Apache... 如果你在网页中执行phpinfo()函数,你会看到区别。 - Postadelmaga
写完那个评论后,我也意识到了。抱歉,我是一个 Linux 新手……谢谢你的出色回答! - toesslab
我喜欢这个解决方案!不幸的是,我尝试使用phpbrew做同样的操作没有成功,虽然我可以完美地运行php7.0.6,并且可以切换到5.6(在禁用php7和启用php5时,命令行中没有任何错误),但是apache似乎无法与php5配合使用,通过localhost无法访问网站(无法达到网站)。如果我切换回php7,apache又能正常工作。我不确定这是否与phpbrew有关,但是我依然无法使用php5... - ToX 82
我猜你可能缺少一些php5.6模块,尝试比较一下php5.6和php7.0的phpinfo,检查一下Apache日志。 - Postadelmaga
谢谢您的回答,但问题是Apache与PHP5根本无法工作。所以没有phpinfo。当我切换到PHP7时,瞬间就可以显示phpinfo了。在/var/log/apache2/error.log中也没有错误,而且在两个版本之间切换时控制台也没有错误。不知道还能不能找到其他地方... - ToX 82
对于其他人来说,在CLI中使用php7.0php5.6而不删除本机的php7安装,php5.6不会出现提示,但仍然可以正常工作。您甚至可以使用php5.6 -v来检查。 - myol
@ToX82 尝试卸载任何 PHP (5.6/7) 包,并按照指南从头开始操作。 - Postadelmaga
@Postadelmaga,通过卸载php和apache并从头重新安装,问题得到解决。谢谢! - ToX 82
sudo ln -sfn /usr/bin/php5 /etc/alternatives/php 是我所需要的。 - Jorge Orpinel Pérez
一些人需要停止使用php5(而不是5.6)。 - Nick
你是一个神... - Geoherna
太棒了!我刚在Linode上搭建了一台全新的Debian 9服务器,需要运行PHP5来支持我正在开发的应用程序。这些指南截至2017年10月非常完美。谢谢! - innovati
投票支持您对于切换Apache和CLI的明确状态 - Abdulla Nilam
1警告:使用这个配方彻底破坏了我的整个PHP,无法修复。浪费了数小时的时间。我使用的是Ubuntu 14.04。只是提醒大家:不要盲目地复制粘贴命令行一行代码,而不知道自己在做什么! - davidkonrad
非常好的方法,对我帮助很大。 - Wolfack
根据此链接(https://askubuntu.com/a/306555/1516753),不建议在较新的操作系统版本上安装早期版本的PHP。例如,Ubuntu 16.04支持PHP 7+。 - variable
@variable,请看看针对你的相同评论的[这条评论](https://askubuntu.com/questions/761713/how-can-i-downgrade-from-php-7-to-php-5-6-on-ubuntu-16-04/766271#comment2577172_766271)。 - bballdave025

Ubuntu 16.04带有php 7.0,并且一些php应用程序可能仍然无法与php 7.0兼容。因此,在某些情况下,同时安装php 7.0和php 5.x可能是明智的选择,这样您可以根据需要随时选择使用哪个版本。
xavi@computer# sudo su
root@computer# add-apt-repository ppa:ondrej/php
root@computer# apt-get update
root@computer# apt-get install php7.0 php5.6 php5.6-mysql php-gettext php5.6-mbstring php-xdebug libapache2-mod-php5.6 libapache2-mod-php7.0 php5.6-curl php5.6-gd php5.6-mcrypt php5.6-xml php5.6-xmlrpc

安装php5.6和php7.0在我的情况下非常顺利:没有任何问题或投诉。
要从php 5.6切换到php 7.0,您需要做两件事:
# For php in web apps
sudo a2dismod php5.6 && sudo a2enmod php7.0 && sudo service apache2 restart
# For php-cli in the command line
sudo ln -sfn /usr/bin/php7.0 /etc/alternatives/php

或者从php7.0转换到php5.6:
# For php in web apps
sudo a2dismod php7.0 && sudo a2enmod php5.6 && sudo service apache2 restart
# For php-cli in the command line
sudo ln -sfn /usr/bin/php5.6 /etc/alternatives/php

你还可以通过运行 php -v 快速检查你正在使用的版本。

1使用sudo a2dismod php7.0 && sudo a2enmod php5.6 && sudo service apache2 restart确保只有在前一个命令成功执行后才运行以下命令。对这个答案提出了修改建议。 - Videonauth
1这是为那些希望在Ubuntu 16.04上同时安装php5.6php7.0的最佳解决方案。 - Amine Jallouli
1太棒了,简直完美无缺。真希望我能多次点赞。 - Yogesh Yadav
根据这个链接(https://askubuntu.com/a/306555/1516753),不推荐在较新的操作系统版本上安装较旧的PHP版本。例如,Ubuntu 16.04支持PHP 7+。 - variable
哦,@variable,要是能坚持那个建议就好了!问题是当你在工作时,有人需要你修复一个写于5-6年前的网页应用程序。试图将所有内容重写为最新的php将比你的老板愿意支付的时间更长。你有家庭,所以没有时间“志愿”。这让你感激像Ondrej这样的人一直维护着这些PPA,这样就可以使用只能在PHP 5.6上运行的Phalcon 5.4,你热爱的工作进展顺利,你的老板也对你满意。 - bballdave025
@variable, 说了这么多,最好还是遵循关于当前软件的建议。很多时候你可能会这样做,但很可能也会有一些几乎不可能的时候。(你会听到"传统"这个词,而这类东西将会非常有用。) - bballdave025

你的问题缺乏重要细节,所以我会给出更广泛的回答。
假设你正在使用软件包,有一些重要的细节:
Apache2可以配置为使用libapache2-mod-php7.0软件包的apache2 SAPI或使用带有mod_proxy_fcgiphp7.0-fpm的FPM SAPI。
Ubuntu 16.04仓库中只有PHP 7.0,您可以使用ppa:ondrej/php来添加对PHP 5.6的支持,命名方案类似(例如libapache2-mod-php5.6php5.6-fpm)。
如果您使用的是Apache2 SAPI(libapache2-mod-php*),在安装了libapache2-mod-php5.6之后,您需要通过运行a2dismod php7.0来禁用PHP 7.0,并通过运行a2enmod php5.6来启用PHP 5.6。
如果您使用的是FPM SAPI(php*-fpm),则需要将FPM Unix套接字从/run/php/php7.0-fpm.sock更改为/run/php/php5.6-fpm.sock
请记住,对于与PHP捆绑的模块(如MySQL),命名约定为phpX.Y-<ext>(例如php7.0-mysqlphp5.6-mysql),但对于外部PECL模块(例如APCu,mongodb,...),只需使用php-<ext>(例如php-apcuphp-mongodb)。我建议在上网前在您的系统上运行apt-cache search php <ext>来搜索正确的软件包名称。

3你能详细说明一下你会如何更改FPM Unix套接字吗? - myol

我建议你删除你的php包并安装php5.6。你可以按照以下步骤进行:
sudo apt-get purge php7.*
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get install php5.6

你可以检查一下你的php版本,以确保没有问题。具体操作如下所示:
php -v

我希望你能够卸载当前的 PHP 包并重新安装 PHP,这将对你非常有帮助。 - ThunderBird
3你不需要进行grep-awk的魔法操作,因为所有打包都依赖于php5-common,所以只需简单地运行apt-get purge php5-common即可从系统中清除所有php5包。 - oerdnj
根据这个链接(https://askubuntu.com/a/306555/1516753),不推荐在较新的操作系统版本上安装较旧的PHP版本。例如,Ubuntu 16.04支持PHP 7+。 - variable
@variable,看看你相同评论的这条评论 - bballdave025