在Apache上出现空白的PHP页面

16

我在一个新设置的DigitalOcean云服务器(CentOS)上安装了PHP和Apache。Web服务器运行正常:

[root@a2m5cent01 httpd]# service httpd status
httpd (pid  11232) is running...
[root@a2m5cent01 httpd]# php --version | head -1
PHP 5.3.3 (cli) (built: Dec 11 2013 03:29:57) 

如果我尝试访问任何PHP页面,浏览器会显示空白页(白页)。

到目前为止,我已经做了以下内容来进行故障排除:

  1. 创建一个包含以下内容的页面:<?php phpinfo(); ?>。从浏览器查看时显示空白页面。
  2. 只是为了确保Apache指向正确的目录,在那里放置了静态的.html页面,并且在浏览器中看到它能够正常显示,因此Apache正在工作并且目录是正确的。
  3. /etc/php.ini中,将display_errors指令更改为On。仍然是空白页面。
  4. 在Apache配置文件(/etc/httpd/conf/httpd.conf)中找到这行代码Include conf.d/*.conf。在conf.d目录中,有一个php.conf文件,其中包含以下行:LoadModule php5_module modules/libphp5.so。确保这个.so文件实际上存在于这个位置。
  5. 在同一文件中,我还有这两行代码:AddHandler php5-script .phpAddType text/html .php
  6. 从CLI执行php页面,它可以正常工作 - 所以php在本地工作。

那么为什么它总是在浏览器上显示一个空白/白页呢?还有什么我错过了吗?

编辑 根据@Nathan的建议,

  1. 我检查了Apache错误日志文件,没有看到任何错误被报告。
  2. 我的/etc/php.ini说,php error_log位于syslog。因此我检查了/var/log/messages,但找不到任何PHP错误消息
  3. 接下来,我将一些普通的HTML放入包含phpinfo()调用的php文件中。有趣的是我发现连正常的HTML文本也没有出现。它仍然产生空白页面。
  4. 然后我检查了Apache的访问日志。惊讶!对于我尝试在浏览器中加载的所有PHP文件,都没有GET请求。但是所有非php文件的GET请求都具有200返回代码。

Apache甚至没有记录任何针对PHP文件的访问请求。有什么想法为什么会发生这种情况?


1
你确认你的HTTP/PHP错误日志没有显示任何消息吗?另外,为了确认页面正在加载但PHP未运行,我建议在phpinfo()之前和之后添加一些HTML。 - Nathan
有趣的是请求没有被记录。你还记得你运行了哪些命令和/或安装PHP时使用了哪些软件包吗?或者更容易的方法是运行“yum list installed | grep“php”| less”来查看已安装的PHP软件包。 - Nathan
php明确没有与apache配置。我在我的vps上也遇到了这个问题。 - DeSmOnd
VPS 意味着虚拟服务器。简而言之,我尝试在我的 CentOS 6 操作系统中安装带有 PHP 的 Apache,但它总是显示空白的 PHP,即无法理解 PHP 文件。然后,我删除了所有相关的东西,如 Apache、PHP 等,并从头开始安装,就像我在更新的答案中所说的那样。此外,您需要做一些事情。 - DeSmOnd
@Nathan 使用您的命令,我得到了这3个软件包:phpphp-cliphp-common - hashbrown
显示剩余3条评论
8个回答

22

查看您的phpinfo()脚本。

<?php
phpinfo();
?>

第一个问号后面缺少"php"将导致空白页面。


1
在我提出的第一个问题中,我已经提到了这一点。但你仍然建议同样的事情。 - hashbrown
为什么我一遍又一遍地犯同样的错误? - edwardsmarkf

6

我认为你的apache上安装的php有问题。这就是为什么你无法在web服务器上看到任何php页面。请完全卸载所有现有应用程序,如httpd、php、php-fpm、php-cli等,然后按以下顺序进行清理安装。

yum install httpd -y
yum install php php-common php-cli php-gd php-curl php-fpm -y

然后确保您重新启动httpd服务器。
service httpd restart

安装 mod_fastcgi:
yum install  mod_fastcgi

启动服务:

service php-fpm start

重启 Apache:
service httpd restart

5. 配置Apache与PHP-FPM

打开fastcgi.conf文件:

nano /etc/httpd/conf.d/fastcgi.conf

将以下内容添加到文件末尾:

<IfModule mod_fastcgi.c>
                DirectoryIndex index.html index.shtml index.cgi index.php
                AddHandler php5-fcgi .php
                Action php5-fcgi /php5-fcgi
                Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
                FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -host 127.0.0.1:9000 -pass-header Authorization
</IfModule>

接着搜索"FastCgiWrapper",确保其设置为"off",然后保存文件。

/usr/lib/cgi-bin/目录必须存在,所以我们创建它:

mkdir /usr/lib/cgi-bin/ 

如果已经安装并启用了mod_php,我们需要将其禁用。打开位于/etc/httpd/conf.d/php.conf的配置文件:

nano /etc/httpd/conf.d/php.conf

将AddHandler和AddType行注释掉,使其看起来像这样:
#
# PHP is an HTML-embedded scripting language which attempts to make it
# easy for developers to write dynamically generated webpages.
#
<IfModule prefork.c>
  LoadModule php5_module modules/libphp5.so
</IfModule>
<IfModule worker.c>
  LoadModule php5_module modules/libphp5-zts.so
</IfModule>
#
# Cause the PHP interpreter to handle files with a .php extension.
#
#AddHandler php5-script .php
#AddType text/html .php
#
# Add index.php to the list of files that will be served as directory
# indexes.
#
DirectoryIndex index.php
#
# Uncomment the following line to allow PHP to pretty-print .phps
# files as PHP source code:
#
#AddType application/x-httpd-php-source .phps

保存文件并重新启动Apache:

service httpd restart

我将尝试使用 fast-cgi 进行重新安装。请稍等,我会更新给您。 - hashbrown
看起来是 DO CentOS 6.5 镜像中的一个 bug。降级到 6.4 可以解决这个问题。 - hashbrown
哦,我在安装 LAMP 时恰好使用的是 Centos 6.4。很高兴看到你的问题已经解决了。 - DeSmOnd
在我的 Fedora 26 系统中,安装了 mod_php(yum -y install mod_php)来解决空白屏幕问题。 - Arun

2

您是直接导航到php文件吗?还是只是进入目录根目录?

如果是后者,Apache可能无法将.php识别为目录索引。

为了测试,请尝试在您的Web根目录中创建一个.htaccess文件,其中包含以下行:

DirectoryIndex index.php

谢谢您的回复,但请避免在答案部分提问。请使用评论进行提问。是的,我直接进入.php文件,而且“DirectoryIndex”已经设置好了。 - hashbrown
2
很抱歉,评论需要50个声望,显然,我现在还没有。 - Aidan

1
我有同样的问题... 问题出在iptables上。(看起来是这样) 尝试使用以下命令:
service iptables stop
## check if it stop...
service iptables status

然后尝试重新加载页面。

如果您有其他解决方案,请分享。

[编辑] 重启iptables服务对我有用。

尝试:

service iptables restart

是什么让你认为这是iptables呢? - Kirby

1

已经有一段时间了,但我想回来更新这个问题,发现问题在目录权限设置上。

我使用的FPM用户没有必要的权限来执行Web根目录中的index.php文件。

为了避免将来出现这些问题,我创建了一个自动化的bash脚本,可以在DigitalOcean服务器上自动创建和配置Web服务器。请在这里查看 https://github.com/akash-mitra/fairy

此脚本将自动执行以下操作:

  • 安装Nginx
  • 为nginx创建虚拟服务器块
  • 安装PHP、PHP APC、PHP Curl等
  • 支持PHP Fast Process Manager (php-fpm)
  • 安装Memcached
  • 安装数据库 (MariaDB / MySQL)
  • 可选地安装PHP Composer和Laravel
  • 配置和加强SSH
  • 激活防火墙
  • 可选地在DO服务器上启用SWAP空间并修复区域设置问题

0

很抱歉重新发布旧帖...这很重要。

我也遇到了没有输出HTML响应的问题。

在仔细检查php.ini或我的apache配置文件后,仍然没有输出,后来发现我使用@抑制了构造函数中嵌套的类的include/require的错误。包含的文件中有语法错误,当抛出错误时会完全停止所有输出。

所以,首先检查您的处理程序。 如果您首先将所有输出存储到变量中,并且您首先包含多个脚本失败,您必须查看这些错误。如果您抑制文件处理程序错误,则如果文件中存在语法错误,则会得到空白屏幕。

在您的php代码中搜索所有@实例。然后将@include "/path_to/script.php";更改为include "/path_to/script.php";或将任何@$foo更改为$foo,因为此类变量可能引用导致您的脚本以未在httpd错误日志或http响应中显示任何内容结束的依赖项。


只是提供信息,您永远不需要为发布答案进行辩解。而这些不是线程,它们只是问题和答案。 - David Makogon
我相信我没有伤害任何人的感情。 - Paul Latour

0

由于一切看起来都是默认状态,您是否已经检查了此部分以确认?

cat /etc/php.ini | grep log_errors

如果log_errors被禁用,请启用它并在重启httpd后检查下面的日志。 /var/log/httpd/error_log

-- 还要检查php配置中的这个部分。
cat /etc/php.ini | grep error_reporting

此值应默认启用,以便display_errors正常工作。
error_reporting = E_ALL


1
log_errors = 开启 error_reporting = E_ALL & ~E_DEPRECATED - hashbrown

0

首先,您应该检查文件的权限。如果您不向公众授予读取权限,则Apache会生成一个空白页面而不显示任何错误。


1
这应该是一个注释。 - Kurt Van den Branden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接