升级到16.04版本。浏览器中无法正常运行php7。

我刚从14.10升级到16.04,不确定如何在apache中配置PHP 7。我已经修改了php7.0.conf文件以取消最后几行的注释,并重新启动了apache2,但没有变化。
我需要更改apache2设置以允许PHP吗?
PHP在命令行中可以正常工作,所以我确定PHP已正确安装。
此外,我在phpadmin上收到一个错误,说mbstring缺失。

1工作的命令行SAPI(php命令)与其他PHP SAPI(apache2,FPM,CGI等)是正交的,因此命令行PHP的工作并不能说明在HTTP服务器中的PHP是否工作。 - oerdnj
2对于缺少mbstring的情况,执行以下操作:sudo apt-get install php-mbstring(谁能想到呢,对吧?) - oerdnj
"php7在浏览器中不工作"是什么意思?你是指Apache无法启动吗?PHP并不是一种客户端语言。 - Andrea Lazzarotto
看到所有这些答案都指导用户启用mpm-prefork和mod-php,真的让人感到沮丧。这是一个巨大的倒退。 - Andrew Ensley
7个回答

就像以前一样,您必须为Apache安装PHP。

服务器指南

sudo apt install php libapache2-mod-php

那个命令将安装PHP和Apache 2 PHP模块。只需像以前一样配置Apache(sudo a2enmod php7.0,我想会打开该模块)。

您的mbstring问题类似-您需要安装该扩展:

sudo apt install php7.0-mbstring

对于其他缺失的模块,也会有类似的东西需要安装。

安装后,php模块应默认启用。如果没有启用,则必须使用完整的“sudo a2enmod php7.0”(或者我在我的计算机上通过禁用和重新启用确定的内容)。有趣的是,我收到了这条消息:“考虑到php5与php7.0的冲突:启用模块php7.0。” - Doug Smythies
@DougSmythies 我猜你没有看到我说过你必须启用该模块的地方... - Thomas Ward
1是的,我尝试过,这就是为什么我发表了评论。sudo a2enmod php 不起作用,我已经尝试过了。然而 sudo a2enmod php7.0 可以起作用。 - Doug Smythies
1这应该被标记为正确答案。Ubuntu 16.04的全新安装默认不包含此apache2模块。 - Selosindis
@Selosindis 绝对同意!不过,仍然很烦人的是,与旧版本相比,Ubuntu 16.04 的标准安装过程发生了变化。 - Socrates

要配置php7以在您的服务器上运行,您需要进行一些配置:
1. 确保删除任何与php/php5相关的痕迹
打开终端Ctrl+Alt+T并执行以下操作:
cd /etc/apache2/mods-enabled
ls -la

输出中不应包含任何`php5.conf`或`php5.load`,但如果有的话,请执行以下操作:
# this is the proper way of disabling modules
sudo a2dismod php5

# run this only if the above command didn't remove the php5 sym-links
sudo rm php5.load
sudo rm php5.conf

现在添加php7.0.confphp7.0.load代替:
# this is the proper way of enabling modules
sudo a2enmod php7.0

# run this only if the above command didn't create the php7.0 sym-links
sudo ln -s php7.0.conf ../mods-available/php7.0.conf
sudo ln -s php7.0.load ../mods-available/php7.0.load

ls -la php* 的输出应该是这样的:

lrwxrwxrwx 1 root root 29 Apr 15 03:55 php7.0.conf -> ../mods-available/php7.0.conf
lrwxrwxrwx 1 root root 29 Apr 15 03:55 php7.0.load -> ../mods-available/php7.0.load

在处理模块之后,我们现在来到/etc/apache2/conf-enabled目录。同样地,通过sudo rm <name>命令删除这里的任何php/php5痕迹。
然后,如果需要的话,执行以下操作:
# the proper way of enabling configs
sudo a2enconf php7.0-cgi
sudo a2enconf php7.0-fpm

# do those commands only if the above didn't work out
sudo ln -s php7.0-cgi.conf ../conf-available/php7.0-cgi.conf
sudo ln -s php7.0-fpm.conf ../conf-available/php7.0-fpm.conf

ls -la php* 的输出应该如下所示:

lrwxrwxrwx 1 root root 33 Apr 21 17:00 php7.0-cgi.conf -> ../conf-available/php7.0-cgi.conf
lrwxrwxrwx 1 root root 33 Apr 21 17:01 php7.0-fpm.conf -> ../conf-available/php7.0-fpm.conf

2. 重启Apache2

在重新启动Apache之前,请确保清除Apache的error.log,然后进行重启:

sudo su
> /var/log/apache2/error.log
exit
sudo service apache2 restart

现在通过输入cat /var/log/apache2/error.log | less来检查error.log文件(通过less命令进行管道传输可以轻松上下滚动,按q退出输出)。
如果你的error.log文件包含许多(我真的是指很多)MIBS not found错误,请执行以下操作:
sudo apt install libsnmp-dev
sudo net-snmp-config --snmpconfpath
sudo apt-get install snmp snmp-mibs-downloader
sudo su
> /var/log/apache2/error.log
exit
sudo service apache2 restart

请再次检查error.log文件,现在应该只包含3行内容。
[Sat Apr 23 01:39:07.504005 2016] [mpm_prefork:notice] [pid 1647] AH00169: caught SIGTERM, shutting down
[Sat Apr 23 01:39:08.685774 2016] [mpm_prefork:notice] [pid 9590] AH00163: Apache/2.4.18 (Ubuntu) mod_perl/2.0.9 Perl/v5.22.1 configured -- resuming normal operations
[Sat Apr 23 01:39:08.685938 2016] [core:notice] [pid 9590] AH00094: Command line: '/usr/sbin/apache2'

您的Apache与php7.0现在应该已正确配置。

2使用a2enmoda2dismod命令,而不是手动在mods-available/mods-enabled目录中调整链接(同样地,对于conf-{available,enabled},可以使用a2enconfa2disconf命令)。 - muru
1根据您的输入修改了我的答案。 - Videonauth
对链接进行调整是有害的,因为a2enmoda2dismod会记住内部apache2软件包注册表中模块的状态,所以手动创建/删除链接可能会导致您的系统在未来升级时出现问题,因为升级脚本会查看这个内部数据库的状态。 - oerdnj
@oerdnj:做一个煎蛋可能会打破鸡蛋... ;-) - Fabby
非常感谢您的回复,我已经按照您的建议进行了上述操作,并且一切看起来都符合您的要求,但是apache2仍然不能让我运行php脚本。 - David Wright
太棒了!我过去三天简直是地狱般的折磨。首先,我的MySQL服务器等等崩溃了,导致我的Drupal项目无法工作。三个工作日后,我不得不重新安装并升级15.10到16.04,然后又出现了本地主机/MySQL连接问题。我按照你上面的步骤进行操作,成功让Apache再次与我的MySQL数据库通信。非常感谢你花时间与我们分享这些信息,这正是askubuntu.com应该做的事情。祝你好运。 - Paul B
1@David Wright - 也许你正在尝试从用户目录运行PHP脚本 - 这些默认是禁用的。如果是这样,你需要打开php7.0.conf并注释掉最后一部分。更多信息请参考这里:http://devplant.net/2010/05/04/linux-php-not-working-in-userdir-public_html/ - d586
只需要执行:sudo a2enmod php7.0 - 就解决了我的问题。 - Petar Vasilev
非常感谢。这一行:sudo apt install libsnmp-dev在我的情况下缺少元素。我花了很多时间搜索这个。你太棒了! - Daniel
太棒了!我在网上尝试了很多其他解决方案,使用了全新安装的Ubuntu 16和Virtualmin。这个方法有效!谢谢你! - petergus

我也遇到了这个问题。

删除所有PHP并重新安装php7对我有所帮助。

所需的全部内容是:

sudo apt-get purge php*

php7将被删除,之后只需重新安装即可:

sudo apt-get install php7.0-mysql php7.0-curl php7.0-json php7.0-cgi  php7.0 libapache2-mod-php7.0

1我之前尝试过几种方法,而这个方法对我有效。谢谢! - Srikanth Ponnapalli
1哇塞,你救了我一命。 - plhn
这是唯一对我有效的解决方案。干杯! - geevee
这对我很有帮助,因为在Ubuntu升级后,我没有在conf-avaliable中找到php7.0-cgi。但是请记住,使用sudo apt-get purge php*命令会同时删除你的phpMyAdmin,如果你有的话。 - Artur Czyżewski

在我的情况下,不仅php无法工作,phpmyadmin也是如此。我按照步骤进行了操作。
sudo apt install php libapache2-mod-php
sudo apt install php7.0-mbstring
sudo a2dismod mpm_event
sudo a2enmod mpm_prefork
service apache2 restart

然后到:
gksu gedit /etc/apache2/apache2.conf

在最后一行中,我添加了Include /etc/phpmyadmin/apache.conf 这样就解决了所有的问题。

我找到的解决办法是将 PHP.INI 的 short_open_tag 设置为默认值。默认情况下,它被设置为“Off”。我的 PHP 代码以此开头。
   <?

而不是

   <?php

如果启用了short_open_tag(通过在php.ini中将'Off'更改为'On'),并重新启动apache服务器(sudo service apache2 restart),PHP就会恢复正常。

1天哪!当然是最后一个有赞的评论最终对我起作用了!非常非常感谢你,@patrick!!! - hyp3rg3om3tric

https://wiki.archlinux.org/index.php/Apache_HTTP_Server

sudo a2dismod mpm_event
sudo a2enmod mpm_prefork
service apache2 restart

注意:上述要求是因为与php-apache一起提供的libphp7.so不适用于mod_mpm_event,而只适用于mod_mpm_prefork。(FS#39218
否则,您将会收到以下错误提示:
Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe.  You need to recompile PHP.
AH00013: Pre-configuration failed
httpd.service: control process exited, code=exited status=1

作为一种替代方案,您可以使用mod_proxy_fcgi(请参阅下面的使用php-fpm和mod_proxy_fcgi)。

我也能够在Ubuntu 16.04的命令行中成功运行PHP脚本,但在任何浏览器中无法运行。为了解决这个问题,我清除了我已有的php7.0和apache2的副本。然后,我从命令行重新安装了它们,包括apache2的php库。当我尝试运行"a2enmod php7.0"时出现了挫折,它告诉我php7.0模块不存在,尽管我再次能够从命令行运行php脚本。本能地启动了。打开Synaptic,我发现当我从命令行安装apache2的php库时,我只安装了libapache2-mod-php7.0,并且忘记了安装"wrapper",即libapache2-mod-php,没有它前者将无法正常工作。

1"包装纸"的名字是什么? - EKons